【问题标题】:How to use C++11 uniform initialization syntax?如何使用 C++11 统一初始化语法?
【发布时间】:2014-07-03 17:08:10
【问题描述】:

我不明白何时以及如何在 C++11 中使用新的统一初始化语法。
例如,我得到这个:

std::string a{"hello world"}; // OK
std::string b{a};  // NOT OK

为什么在第二种情况下不起作用?错误是:

error: no matching function for call to ‘std::basic_string<char>::basic_string(<brace enclosed initializer list>)’    

使用此版本的 g++ g++ (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2

对于原始数据,我应该使用什么语法?

int i = 5;
int i{5};
int i = {5};

【问题讨论】:

  • 首先,您需要告诉我们您正在使用的 wich 编译器的哪个版本,因为它肯定是您当前设置中未实现的错误或功能。
  • 这是一个演示第一个错误的 ideone,ideone.com/zXIto

标签: c++ c++11 uniform-initialization


【解决方案1】:

编译错误

// T t{u};
std::string a;
std::string b{a};

是四样东西的组合

  • 直到不久前的草案说,如果T 有一个初始化列表构造函数(std::string 有一个,采用char 元素),则初始化列表本身作为参数传递。所以构造函数的参数不是a,而是{a}

  • 草案说初始化引用的初始化列表不是通过直接绑定来完成的,而是首先从初始化列表中的元素构造一个临时对象,然后将目标引用绑定到该临时对象。

  • 草案中说,当通过初始化列表初始化引用时,当引用的初始化不是直接绑定时,转换序列是用户定义的转换序列。

  • 草案说,当考虑类 X 的构造函数作为在上述上下文中的重载解决方案中的候选者时,当传递初始化器列表本身时,当考虑类型为“引用的第一个构造函数”时cv X" (cv = const / volatile) - 换句话说,很可能是复制或移动构造函数,则不允许用户定义转换。否则,如果允许这样的转换,您可能总是在模棱两可的情况下运行,因为使用列表初始化您不仅限于一个嵌套的用户定义转换。

以上所有的组合是没有构造函数可以用来取{a}。使用initializer_list&lt;char&gt; 的不匹配,其他使用string&amp;&amp;const string&amp; 的被禁止,因为它们需要用户定义的转换才能将其参数绑定到{a}

请注意,最近的草案更改了第一条规则:他们说如果没有初始化列表构造函数可以获取初始化列表,则参数列表由初始化列表的所有元素组成。使用更新后的规则,您的示例代码可以正常工作。

【讨论】:

  • VS 2012 with C++ Compiler CTP November 2012 它工作得很好。
【解决方案2】:

第一个示例应该可以工作,调用复制构造函数。如果您使用的是 GCC,这已在 4.6 中修复。

最后的例子有轻微的非风格差异。

int i = 5.0;   // fine, stores 5
int i{5.0};    // won't compile!
int i = {5.0}; // won't compile!

不同之处在于统一初始化语法不允许缩小转换。在它们之间进行选择时,您可能需要考虑到这一点。

【讨论】:

  • @deft_code 不,因为5.0double。缩小转换是由类型定义的,而不是值。我想我会将我的示例更改为 5.0 以避免给出只有截断才重要的想法:)
  • @deft_code 好吧,我的意思是,this 类型的缩小转换(浮点到整数)是由类型定义的。如果它们是常量表达式,则某些缩小转换取决于值。
  • 4.6已经修复了,4.6之前的版本没有解决办法吗?
【解决方案3】:

因为你忘记了分号,所以它不起作用:

std::string b{a};
               ^^^

否则这种语法很好,它会调用复制构造函数。

对于第二个问题,如果您想统一,请使用int i{5};,尽管int i = 5; 可能更具可读性。

【讨论】:

  • 对不起,我忘记了写问题的分号。我现在把错误写出来。
  • 好的。它适用于 GCC 4.6.1,但不适用于 4.4.3。新标准的问题是它还没有得到彻底的支持。 :-(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-08
  • 2014-09-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多