此代码示例是否有效?
using ref = char&;
ref foo(ref x) {
return ref{x};
}
int main() {
char a;
foo(a);
return 0;
}
似乎:
- clang 3.5 说是
gcc 4.9 说不
main.cpp: In function 'char& foo(ref)': main.cpp:4:15: error: invalid cast of an rvalue expression of type 'char' to type 'ref {aka char&}' return ref{x}; ^
http://coliru.stacked-crooked.com/a/cb6604b81083393f
那么哪个编译器是正确的呢?还是未指定?
它很容易通过以下方式克服 gcc 构建错误:
使用括号代替大括号
ref foo(ref x) { return ref(x); }
通过命名返回值
ref foo(ref x) { ref ret{x}; return ret; }
选项 1. 破坏统一初始化,选项 2. 添加无用的代码行。
这里已经提出了类似的问题: Why can't I initialize a reference in an initializer list with uniform initialization?
但提到 pr50025 在 gcc 4.9 中已修复。
我知道上面的代码示例毫无用处,但我故意将其过度简化以指出问题所在。在现实生活中,代码问题可以隐藏在一个通用函数中,例如:
#include <utility>
template <typename Tp, typename... Us>
Tp bar(Us&&... us) {
return Tp{std::forward<Us>(us)...};
}