使用双括号,例如Foo {{initializer list}}解决歧义

时间:2014-12-11 08:45:10

标签: c++ c++11 initializer-list

最近有人证明了C ++的可怕性(here):

cout << string(50, 'x'); // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
cout << string{50, 'x'}; // 2x

std :: string将第二行视为初始化列表。

我非常喜欢使用{}初始化语法,但是我要实现一个可以使用初始化列表初始化的类。

有没有办法编写以下语法:

Foo{x};        // initialise a Foo object with x
Foo{{x,y,z}};  // initialise a Foo object with initialiser list
Foo{{x}};      // initialise a Foo object with initialiser list with ONE item

1 个答案:

答案 0 :(得分:0)

最后,我通过让我的类使用可变参数包而不是初始化列表来解决这个问题。

我还没有遇到一个例子,你不能以这种方式绕过初始化列表。