为什么无法使用统一初始化初始化初始化列表中的引用? [英] Why can't I initialize a reference in an initializer list with uniform initialization?
问题描述
这就是为什么:
struct S {};
struct T
{
T(S& s):s {s} {}
S& s;
};
int main()
{
S s;
T t {s};
}
给我一个GCC 4.7的编译器错误:
test.cpp:在构造函数'T :: T(S&)':
test.cpp:5:18:
$ b的类型的右值从<大括号括起始化列表> $ b
?
要修正错误,我必须将 s {s}
更改为 s(s)
。
是的,它的a bug 。这是一项新功能,并于2012年2月在工作文件中投票( link < a>)。
提出了一个好处,因为gcc实际上是根据FDIS批准的C ++ 11标准的符合标准的编译器,因为对工作纸是在那之后。
That is, why does this:
struct S {};
struct T
{
T(S& s) : s{s} {}
S& s;
};
int main()
{
S s;
T t{s};
}
give me a compiler error with GCC 4.7:
test.cpp: In constructor 'T::T(S&)':
test.cpp:5:18: error: invalid initialization of non-const reference of type 'S&' from an rvalue of type '<brace-enclosed initializer list>'
?
To fix the error, I have to change the s{s}
to s(s)
. Doesn't this break the, erm, uniformity of uniform initialization?
EDIT: I tried with clang, and clang accepts it, so perhaps it's a GCC bug?
Yes, its a bug. This is something new and was voted in the working paper in February 2012 (link).
Nicol Bolas makes a good point in that gcc is actually the conforming compiler according to the FDIS approved C++11 standard because the changes to the working paper were made after that.
这篇关于为什么无法使用统一初始化初始化初始化列表中的引用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!