相关疑难解决方法(0)

2753
推荐指数
11
解决办法
81万
查看次数

为什么列表初始化(使用花括号)比替代品更好?

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++ syntax initialization c++11 list-initialization

349
推荐指数
5
解决办法
13万
查看次数

何时使用支架封闭的初始化器?

在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)

c++ initializer-list c++11

91
推荐指数
3
解决办法
3万
查看次数

最令人烦恼的解析的目的是什么?

维基百科上,我发现了这个:

A a( A() );
Run Code Online (Sandbox Code Playgroud)

[这]可以消除歧义

  1. class [ A] 的变量定义,取一个类[ A]或的匿名实例

  2. 函数的函数声明,它返回一个类型为[ A] 的对象,并获取一个(未命名的)参数,该参数是一个返回类型[ A](并且不进行输入)的函数.

大多数程序员都期望第一个,但C++标准要求它被解释为第二个.

但为什么?如果大多数C++社区都期望以前的行为,为什么不把它作为标准呢?此外,如果考虑解析歧义,则上述语法是一致的.

有人可以赐教吗?为什么标准要求这个?

c++

16
推荐指数
4
解决办法
877
查看次数

为什么建议使用统一初始化(使用大括号初始化)?

我看到很多不同的地方建议使用统一初始化.Herb Sutter 推荐它,并在使用时列出清单.似乎普遍的共识是使用这种语法.

但是,我不明白为什么.它具有std::initializer_list优先权的问题.添加std::initializer_list到类可能会破坏代码.使用模板时,建议不要使用.它似乎比"旧"方式有更多例外.旧方式不存在这些问题.

我不明白为什么统一初始化是优越的.我的结论是继续使用()语法,并且{} 在我想用构造函数调用的情况下使用std::initializer_list.

为什么?统一初始化给出了什么?

  • 禁止缩小:良好的功能.但是,由于我的所有代码都有缩小警告(因为我想知道我的代码中的所有缩小,而不仅仅是初始化),我不需要太多这个功能.
  • 最令人烦恼的解析:是的,这是一个问题,但我非常非常罕见.所以这不是(对我而言)切换的原因.这个地方,我可以使用{}.
  • 还有什么(也许,我还在学习C++的新功能)?

使用"旧"方式,没有要记住的规则,没有可能的代码破坏.只是使用它,有时,非常非常罕见,你打了最令人烦恼的解析.就这样.

我的想法在某处错了吗?

c++

7
推荐指数
1
解决办法
249
查看次数