【问题标题】:value initialization for automatic variables [duplicate]自动变量的值初始化
【发布时间】:2012-02-19 04:24:18
【问题描述】:

可能重复:
non-copyable objects and value initialization: g++ vs msvc
Value-initializing an automatic object?

考虑以下语句:

实际上不可能对自动对象进行值初始化。

这个说法是真的吗?我认为这样做没有问题:

int main()
{
    int i = int();
}

【问题讨论】:

标签: c++ value-initialization


【解决方案1】:

value-initialization 一词在 8.5 [dcl.init] 第 16 段第 4 条中定义:

如果初始化器是(),则对象是值初始化的。

也就是说,自动变量的值初始化如下所示:

int i();

但是,这是一个名为 i 的函数的声明,它返回一个 int。因此,不可能对自动进行值初始化。在您的示例中,临时变量是值初始化的,而自动变量是复制初始化的。您可以验证这确实需要使用没有可访问复制构造函数的测试类来访问复制构造函数:

class noncopyable {
    noncopyable(noncopyable const&);
public:
    noncopyable();
};

int main() {
    noncopyable i = noncopyable(); // ERROR: not copyable
}

SINCE C++11int i{}; 执行 job(另请参见 this)。

【讨论】:

  • :int i(6)是一个值初始化,int i(int())是什么意思
  • 为什么这是值初始化?? T * p2 = 新 T();
  • int i(6) 的形式是 直接初始化(8.5 [dcl.init] 第 15 段)。 int i(int()) 声明了一个名为 i 的函数,返回一个 int 并接受一个没有参数的函数并返回 int 作为参数。在 T* p2 = new T() 中,newed 对象是值初始化的,指针 p2 是复制初始化的。
猜你喜欢
  • 1970-01-01
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多