【发布时间】:2014-09-18 17:25:23
【问题描述】:
假设我有这样的课程:
class Foo
{
public:
Foo(int something) {}
};
我使用以下语法创建它:
Foo f{10};
然后我添加一个新的构造函数:
class Foo
{
public:
Foo(int something) {}
Foo(std::initializer_list<int>) {}
};
f 的构造会发生什么?我的理解是它将不再调用第一个构造函数,而是现在调用初始化列表构造函数。如果是这样,这似乎很糟糕。为什么这么多人推荐使用{} 语法而不是() 进行对象构造,而稍后添加initializer_list 构造函数可能会无声无息地破坏事情?
我可以想象这样一种情况,我正在使用 {} 语法构造一个右值(以避免最麻烦的解析),但后来有人向该对象添加了一个 std::initializer_list 构造函数。现在代码中断了,我不能再使用右值构造它,因为我必须切换回() 语法,这会导致最麻烦的解析。这种情况该如何处理?
【问题讨论】:
-
有些人因为这个和其他原因不推荐它。 (顺便说一句,
intializer_listctor 将是首选。) -
没错。它一直在尝试为所有初始化创建一种语法,但如果有多种初始化可以执行的方式,这必然有缺点——必须消除歧义,而且这可能不是完美的。
-
我会说稍后添加一个具有与其他构造函数相同类型的元素的
initializer_list构造函数是一个糟糕的设计决定。如果必须这样做,您可能应该向其他构造函数添加标签参数或其他内容以消除歧义。 -
@Praetorian 见
vector。 -
请参阅this Q&A 以获取标准库中令人惊讶的示例列表。只要确保您不会陷入其中,否则我仍然更喜欢
{}而不是(),因为{}可以在任何地方使用。