C++ 11通用初始化导致意外初始化?

H X*_* Xu 15 c++ c++11

在C++ 11中,新的通用初始化语法也可用于调用普通构造函数(不接受initializer_list参数).虽然看起来不错,但我认为这可能会导致实际使用中出现问题.

因此,假设在我的项目中,我使用了以下类附带的库:

class Foo
{
public:
    Foo(int size, int value); // create 'size' number of elements
    Foo(initializer_list<int> list);  // create elements as in 'list'
}
Run Code Online (Sandbox Code Playgroud)

在项目中,它以这种方式使用:

Foo foo{10, 2};  // initialize foo with 2 elements: 10 and 2
Run Code Online (Sandbox Code Playgroud)

现在该库得到了一个新版本,在新版本中,作者删除了第二个构造函数,该构造函数接受了initializer_list(无论是出于目的还是出错).我没有注意到变化,我的项目像以前一样快乐地构建,只是意外的foo被初始化(现在它是10个元素而不是2个).

这个问题的另一个版本是Foo只有第一个构造函数,你使用通用初始化语法来初始化foo,现在作者已经决定添加第二个构造函数,这同样会导致foo被初始化为不同的元素而不会被注意到.

只想知道其他人对此的看法.这是一个真正的问题还是我担心太多?是否有任何解决方案可以防止这种情况发生?谢谢.

Ste*_*oft 1

真正的问题是 API 发生了变化。

如果构造函数是

Foo(int size, int value);
Run Code Online (Sandbox Code Playgroud)

你用过

Foo foo(10, 2);
Run Code Online (Sandbox Code Playgroud)

API 将更改为

Foo(int value, int size);
Run Code Online (Sandbox Code Playgroud)

你也会遇到同样的问题。