explicit关键字在C++中意味着什么?
MyClass a1 {a}; // clearer and less error-prone than the other three
MyClass a2 = {a};
MyClass a3 = a;
MyClass a4(a);
Run Code Online (Sandbox Code Playgroud)
为什么?
我在SO上找不到答案,所以让我回答一下我自己的问题.
在C++ 11中,我们有了用于初始化类的新语法,它为我们提供了如何初始化变量的大量可能性.
{ // Example 1
int b(1);
int a{1};
int c = 1;
int d = {1};
}
{ // Example 2
std::complex<double> b(3,4);
std::complex<double> a{3,4};
std::complex<double> c = {3,4};
auto d = std::complex<double>(3,4);
auto e = std::complex<double>{3,4};
}
{ // Example 3
std::string a(3,'x');
std::string b{3,'x'}; // oops
}
{ // Example 4
std::function<int(int,int)> a(std::plus<int>());
std::function<int(int,int)> b{std::plus<int>()};
}
{ // Example 5
std::unique_ptr<int> a(new int(5));
std::unique_ptr<int> b{new int(5)};
}
{ // Example 6
std::locale::global(std::locale("")); // copied from 22.4.8.3 …Run Code Online (Sandbox Code Playgroud) 在维基百科上,我发现了这个:
A a( A() );
Run Code Online (Sandbox Code Playgroud)
[这]可以消除歧义
class [
A] 的变量定义,取一个类[A]或的匿名实例函数的函数声明,它返回一个类型为[
A] 的对象,并获取一个(未命名的)参数,该参数是一个返回类型[A](并且不进行输入)的函数.大多数程序员都期望第一个,但C++标准要求它被解释为第二个.
但为什么?如果大多数C++社区都期望以前的行为,为什么不把它作为标准呢?此外,如果不考虑解析歧义,则上述语法是一致的.
有人可以赐教吗?为什么标准要求这个?
我看到很多不同的地方建议使用统一初始化.Herb Sutter 推荐它,并在不使用时列出清单.似乎普遍的共识是使用这种语法.
但是,我不明白为什么.它具有std::initializer_list优先权的问题.添加std::initializer_list到类可能会破坏代码.使用模板时,建议不要使用.它似乎比"旧"方式有更多例外.旧方式不存在这些问题.
我不明白为什么统一初始化是优越的.我的结论是继续使用()语法,并且{} 仅在我想用构造函数调用的情况下使用std::initializer_list.
为什么?统一初始化给出了什么?
{}.使用"旧"方式,没有要记住的规则,没有可能的代码破坏.只是使用它,有时,非常非常罕见,你打了最令人烦恼的解析.就这样.
我的想法在某处错了吗?