C++ C++;11构造函数和运算符的统一初始化=

C++ C++;11构造函数和运算符的统一初始化=,c++,c++11,initialization,C++,C++11,Initialization,我有T类和表,它使用T作为构造参数 struct T { string name; long value; }; class Table { public: T a, b, c; Table(T a, T b, T c) { cout << "From constructor: " << a.name << endl; this->a = a; this->b = b; this

我有T类和表,它使用T作为构造参数

struct T {
    string name;
    long value;
};

class Table {

public:
    T a, b, c;

    Table(T a, T b, T c) {
        cout << "From constructor: " << a.name << endl;
        this->a = a; this->b = b; this->c = c;
    }
    Table& operator=(const Table& a) {
        cout << "In op=: " << a.a.name << endl;
        return *this;
    }
};
但是,它们都只调用构造函数

From constructor: Donald Duck
From constructor: Donald Dog

可能有什么问题?在这种情况下如何调用=运算符

运算符=
用于赋值,而不是初始化。若要引发此问题,必须将其指定给已存在的对象

Table t = {blah, blah};   // initialisation
t = {wibble, wobble};     // assignment

运算符=
用于赋值,而不是初始化。若要引发此问题,必须将其指定给已存在的对象

Table t = {blah, blah};   // initialisation
t = {wibble, wobble};     // assignment

8.5初始化器[dcl.init]

声明器可以为正在执行的标识符指定初始值 宣布。标识符指定正在初始化的变量。这个 8.5剩余部分中描述的初始化过程适用 也适用于其他语法上下文指定的初始化,例如 作为带参数表达式的函数参数的初始化 (5.2.2)或返回值的初始化(6.6.3)


构造电话号码2的方法是使用第二种初始化语法。

8.5初始化器[dcl.init]

声明器可以为正在执行的标识符指定初始值 宣布。标识符指定正在初始化的变量。这个 8.5剩余部分中描述的初始化过程适用 也适用于其他语法上下文指定的初始化,例如 作为带参数表达式的函数参数的初始化 (5.2.2)或返回值的初始化(6.6.3)


构造电话号码2的方法是使用第二个初始化语法。

运算符=用于为已初始化的对象分配新值。虽然第二个例子看起来像它使用了= -运算符,但是C++标准实际上定义了它的语义,而不是赋值初始化。如果您想添加一个额外的行
phone\u numbers2=phone\u numbers,该行将使用赋值运算符。这是一个典型的误解。。。实际上,我对相关部分中没有明显的重复感到困惑。
操作符=
用于为已初始化的对象分配新值。虽然第二个例子看起来像它使用了= -运算符,但是C++标准实际上定义了它的语义,而不是赋值初始化。如果您想添加一个额外的行
phone\u numbers2=phone\u numbers,该行将使用赋值运算符。这是一个典型的误解。。。事实上,我对相关章节中没有明显的欺骗感到困惑。
initializer:
    brace-or-equal-initializer
    ( expression-list )

brace-or-equal-initializer:
    = initializer-clause
    braced-init-list

initializer-clause:
    assignment-expression
    braced-init-list

initializer-list:
    initializer-clause ... opt
    initializer-list , initializer-clause ... opt

braced-init-list:
    { initializer-list , opt }
    {}