在 C++ 中使用函数式转换初始化变量
Initializing a variable with function-style cast in C++
int main(){
int a = 5; // copy initialization.
int b(a); // direct initialization.
int *c = new int(a); // also direct initialization, on heap.
int d = int(a); // functional cast, also direct initialization?
// or copy initialization?
return 0;
}
我有两个问题:
1 - 我不清楚 int(a);
是否只是一个演员,或者它是否也是一个初始化程序。
d
是 copy initialized
还是 direct initialized
?
即表达式等于:
int d = 5;
或这个
int d(5);
2- 我想确认 new int(a);
是否只是一个初始值设定项,而不是对 int 的强制转换。还想确认它是 direct initialization
而不是 copy initialization
.
我已阅读参考资料的第 (3) 部分,但我不清楚答案:
https://en.cppreference.com/w/cpp/language/direct_initialization
- initialization of a prvalue temporary (until C++17)the result object of a prvalue (since C++17) by functional cast or with a parenthesized expression list
您的分析缺少一些步骤。
int *c = new int(a);
这执行动态分配的 int
实例的直接初始化。
new
运算符的计算结果为指针纯右值(类型 = int*
),它是这个新 int
对象的地址。
c
是从指针 prvalue 复制初始化的。
int d = int(a);
这执行临时 int
实例的直接初始化,它是纯右值(类型 = int
)。
d
是从此纯右值复制初始化的。
在这两种情况下,复制构造函数调用在所有 C++ 版本中都可以省略,并且在最新标准中保证省略。
int main(){
int a = 5; // copy initialization.
int b(a); // direct initialization.
int *c = new int(a); // also direct initialization, on heap.
int d = int(a); // functional cast, also direct initialization?
// or copy initialization?
return 0;
}
我有两个问题:
1 - 我不清楚 int(a);
是否只是一个演员,或者它是否也是一个初始化程序。
d
是 copy initialized
还是 direct initialized
?
即表达式等于:
int d = 5;
或这个
int d(5);
2- 我想确认 new int(a);
是否只是一个初始值设定项,而不是对 int 的强制转换。还想确认它是 direct initialization
而不是 copy initialization
.
我已阅读参考资料的第 (3) 部分,但我不清楚答案: https://en.cppreference.com/w/cpp/language/direct_initialization
- initialization of a prvalue temporary (until C++17)the result object of a prvalue (since C++17) by functional cast or with a parenthesized expression list
您的分析缺少一些步骤。
int *c = new int(a);
这执行动态分配的
int
实例的直接初始化。new
运算符的计算结果为指针纯右值(类型 =int*
),它是这个新int
对象的地址。c
是从指针 prvalue 复制初始化的。
int d = int(a);
这执行临时
int
实例的直接初始化,它是纯右值(类型 =int
)。d
是从此纯右值复制初始化的。
在这两种情况下,复制构造函数调用在所有 C++ 版本中都可以省略,并且在最新标准中保证省略。