可能重复:
When should you use direct initialization and when copy initialization?
我知道两者
int a = 1;
和
int a(1);
在C ++中工作,但哪一个被认为更好用?
答案 0 :(得分:11)
对于int
,没有区别。 int a = 1;
语法为 copy-initialziation ,而int a(1);
为直接初始化。即使对于通用类类型,编译器也几乎可以保证生成相同的代码,但是复制初始化要求类不具有声明为explicit
的复制构造函数。
为了解释这一点,直接初始化直接调用相应的构造函数:
T x(arg);
另一方面,复制初始化表现为“好像”一个副本:
T x = arg; // "as if" T x(T(arg));, but implicitly so
明确允许并鼓励复制省略,但“仿佛”构造必须仍然有效,即复制构造函数必须是可访问的,而不是显式的或删除的。一个例子:
struct T
{
T(int) { } // one-argument constructor needed for `T x = 1;` syntax
// T(T const &) = delete; // Error: deleted copy constructor
// explicit T(T const &) = default; // Error: explicit copy constructor
// private: T(T const &) = default; // Error: inaccessible copy constructor
};
答案 1 :(得分:1)
当一切都是1和0时,两者最终都是一样的,只是保持一致。
答案 2 :(得分:1)
当您在示例中使用原始类型时,它没有任何区别。对于类,赋值形式在理论上效率较低,因为它可能涉及对复制构造函数的额外调用;但实际上我希望这个电话几乎总能被优化掉。
另一方面,第二种形式可能会出现在所谓的C++'s most vexing parse中,这是一种声明:
a b(c());
被解释为函数声明而不是变量定义。
我认为第二个问题比第一个问题更令人担忧,所以我一直使用变量定义的赋值风格。