このコード サンプルは有効ですか?
using ref = char&;
ref foo(ref x) {
return ref{x};
}
int main() {
char a;
foo(a);
return 0;
}
のようだ:
- clang 3.5はYESと言います
gcc 4.9はNOと言います
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. 無駄なコード行を追加します。
同様の質問がすでにここで聞かれました: なぜ一様な初期化でイニシャライザ リストの参照を初期化できないのですか?
ただし、前述の pr50025 は gcc 4.9 で修正されています。
上記のコード サンプルが役に立たないことはわかっていますが、問題を指摘するために意図的に単純化しすぎています。実際のコードの問題は、次のような一般的な関数に隠されている可能性があります。
#include <utility>
template <typename Tp, typename... Us>
Tp bar(Us&&... us) {
return Tp{std::forward<Us>(us)...};
}