【问题标题】:C++11: Difference between v = { } and v { } [duplicate]C ++ 11:v = {}和v {}之间的区别[重复]
【发布时间】:2014-03-16 09:22:11
【问题描述】:

我想问一下以下两种说法是否有区别:

// C++11
std::vector<int> d {1, 2, 3};
std::vector<int> d = {1, 2, 3};

在这两种情况下,都会调用序列构造函数:

class A {
public:
  int a;

  A() {
    cout << "default constructor" << endl;
  };

  A(const A& other) {
    cout << "copy constructor" << endl;
  };

  A& operator =(const A& other) {
    cout << "assignment operator" << endl;
  }

  A(std::initializer_list<int> e) {
    cout << "sequence constructor" << endl;
  };

  A& operator =(std::initializer_list<int> e) {
    cout << "initializer list assignment operator" << endl;
  }
};

int main(int argc, char** argv) {

  A a {1, 2}; // sequence constructor
  A b = {1, 2}; // sequence constructor
  b = {1, 2}; // initializer list assignment operator
}

【问题讨论】:

    标签: c++ c++11


    【解决方案1】:

    例如做

    A myA{...};
    

    将始终调用适当的构造函数。

    但是做

    A myA = ...;
    

    会根据赋值右侧的表达式做不同的事情,因为它可能会调用复制构造函数。或者使用复制省略对其进行优化。

    另外,如果你有一个数组,你必须使用赋值语法。

    【讨论】:

    • 您不需要数组的“赋值”语法,至少在 C++11 中不需要。无论如何,= 变体需要隐式转换(请参阅副本。)
    • 底线是,对于所有意图和目的,几乎每个编译器都将处理 OP 的两种情况(即初始化列表),除非auto 在左侧。
    • @TimSeguine 编译器仍然必须遵循语言的规则,并且每种情况的规则都不同。在大多数情况下,最终效果是相同的,但这不取决于编译器来决定。而且我已经看到了带有explicit多参数构造函数的真实代码......
    • @juanchopanza 是的,这就是为什么了解实际规则是件好事。但是“几乎”总是真实的谎言是值得知道的。
    猜你喜欢
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 2017-07-04
    • 1970-01-01
    • 1970-01-01
    • 2018-10-24
    相关资源
    最近更新 更多