在 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); 是否只是一个演员,或者它是否也是一个初始化程序。 dcopy 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

  1. 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);
  1. 这执行动态分配的 int 实例的直接初始化。

  2. new 运算符的计算结果为指针纯右值(类型 = int*),它是这个新 int 对象的地址。

  3. c 是从指针 prvalue 复制初始化的。

int d = int(a);
  1. 这执行临时 int 实例的直接初始化,它是纯右值(类型 = int)。

  2. d 是从此纯右值复制初始化的。

在这两种情况下,复制构造函数调用在所有 C++ 版本中都可以省略,并且在最新标准中保证省略。