c++ - 杂项临时对象 T()

标签 c++ most-vexing-parse temporary-objects

<分区>

考虑这段代码:

int main()
{
    int i(6); //this will result in i==6,but consider next initializations

    int j(int()); 

    T * p2 = new T(); 
}

我发现 j 的值是 1,但这应该是 0,因为 int() 是一个临时值,其值等于 0。

此外,new 运算符的语法是 new typename,但这里的 T() 将是一个临时对象而不是类型姓名。

最佳答案

int j(int()); 

这并没有声明一个对象。相反,它声明了一个将函数作为参数并返回 int 的函数。它作为参数的函数类型是这样的:

 typedef int (*funtype)();

也就是说,一个返回 int 并且不接受任何参数的函数。

这种声明的解析通常被称为:


并且在 new 语法中,T() 不会创建临时对象。事实并非如此。相反,您必须查看整个表达式 new T(),它首先为 T 类型的对象分配内存,然后在该内存中构造对象。如果 T 是用户定义类型,则在分配内存后调用默认构造函数构造对象。

关于c++ - 杂项临时对象 T(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9347324/

相关文章:

c++ - 为什么在这个例子中可以返回临时对象?

c++ - 我该如何更改MFC应用程序工具栏中的按钮的IMAGE(与类型无关)?

c++ - 如何使用STL获取中位数的索引?

c++ - 在 C++ 中设置构造函数默认值

c++ - 模板类在非参数化构造函数上抛出错误

c++ - 强制执行参数评估顺序,同时保留表达式的生命周期

python - 基于 python 版本的 C++ python 扩展的输出差异

c++ - 相关函数族的通用函数(例如 std::stoi、std::stof、std::stod 等)

c++ - 如何正确使用 vector 范围构造函数?

c++ - 使用旧的 C 库调用临时对象的方法会导致编译器错误