C++11 构造函数和 operator= 的统一初始化

C++11 Uniform initialization for constructor and operator=

我有 T class 和使用 T 作为构造参数的 Table。

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;
    }
};

我还有一个示例函数试图调用构造函数和 = 运算符。

int main(int argc, char *argv[]) {   
    Table phone_numbers {
        { "Donald Duck", 2015551234 },
        { "Mike Doonesbury", 9794566089 }, 
        { "Kell Dewclaw", 1123581321 }
        };
    Table phone_numbers2 = {
        { "Donald Dog", 2015551234 },
        { "Mike Doonesbury", 9794566089 }, 
        { "Kell Dewclaw", 1123581321 }
        };

}

但是它们都只调用构造函数。

From constructor: Donald Duck
From constructor: Donald Dog

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

operator= 用于赋值,而不是初始化。要激发这一点,您必须分配给一个已经存在的对象。

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

8.5 初始化器 [dcl.init]

A declarator can specify an initial value for the identifier being declared. The identifier designates a variable being initialized. The process of initialization described in the remainder of 8.5 applies also to initializations specified by other syntactic contexts, such as the initialization of function parameters with argument expressions (5.2.2) or the initialization of return values (6.6.3).

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 }
    {}  

您构造 phone_numbers2 的方式是使用第二种初始化语法。