4

可能重复:
什么时候应该使用直接初始化,什么时候应该使用复制初始化?

我知道两者

int a = 1;

int a(1);

在 C++ 中工作,但哪个更好用?

4

3 回答 3

11

因为int没有区别。int a = 1;语法是复制初始化,而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
};
于 2012-06-02T16:52:38.733 回答
1

当全部为 1 和 0 时,两者最终都相同,只要保持一致即可。

于 2012-06-02T16:44:52.843 回答
1

当您在示例中使用原始类型时,它没有任何区别。对于类,赋值形式理论上效率较低,因为它可能涉及对复制构造函数的额外调用;但是在实践中,我希望这个调用几乎总是被优化掉。

另一方面,第二种形式可能会导致所谓的C++ 最令人烦恼的 parse,即如下语句:

a b(c());

被解释为函数声明而不是变量定义。

我认为第二个问题比第一个问题更令人担忧,所以我一直使用变量定义的赋值风格。

于 2012-06-02T16:58:54.503 回答