假设我有一个这样的类:
class Foo
{
public:
Foo(int something) {}
};
Run Code Online (Sandbox Code Playgroud)
我使用以下语法创建它:
Foo f{10};
Run Code Online (Sandbox Code Playgroud)
然后我添加一个新的构造函数:
class Foo
{
public:
Foo(int something) {}
Foo(std::initializer_list<int>) {}
};
Run Code Online (Sandbox Code Playgroud)
施工会f怎样?我的理解是它将不再调用第一个构造函数,而是现在调用init list构造函数.如果是这样,这似乎很糟糕.为什么有这么多人建议在以后添加initializer_list构造函数时使用{}语法()来构造对象可能会默默地破坏事物?
我可以想象一个案例,我正在使用{}语法构造一个rvalue (以避免最烦恼的解析)但后来有人std::initializer_list为该对象添加了一个构造函数.现在代码中断,我不能再使用右值来构造它,因为我必须切换回()语法,这将导致最令人烦恼的解析.如何处理这种情况?
f 的构造会发生什么?我的理解是,它将不再调用第一个构造函数,而是调用 init list 构造函数。如果是这样,这似乎很糟糕。为什么这么多人建议使用
{}语法 over()进行对象构造,而稍后添加initializer_list构造函数可能会悄无声息地破坏事物?
一方面,让初始值设定项列表构造函数和另一个都可行是不寻常的。另一方面,“通用初始化”在 C++11 标准版本中被过度宣传,因此不应毫无疑问地使用它。
大括号最适合聚合体和容器等,因此我更喜欢在包围一些将拥有/包含的东西时使用它们。另一方面,括号对于仅描述如何生成新事物的论证很有用。
我可以想象这样一种情况:我使用 {} 语法构造一个右值(以避免最令人烦恼的解析),但后来有人向该对象添加了一个 std::initializer_list 构造函数。现在代码中断了,我不能再使用右值构造它,因为我必须切换回 () 语法,这会导致最令人烦恼的解析。面对这种情况,人们会如何处理呢?
MVP 仅在声明符和表达式之间存在歧义时发生,并且只有当您尝试调用的所有构造函数都是默认构造函数时才会发生这种情况。空列表{}始终调用默认构造函数,而不是具有空列表的初始值设定项列表构造函数。(这意味着它可以毫无风险地使用。“通用”值初始化是真实存在的。)
如果大括号/括号内有任何子表达式,则 MVP 问题已经解决。
| 归档时间: |
|
| 查看次数: |
162 次 |
| 最近记录: |