以下のスニペットを検討してください。
template <class T>
using identity = T;
template <class T>
void foo(identity<T>&&) {}
int main()
{
int i{};
foo(i);
}
iは左辺値であるためfoo、転送参照パラメーターを宣言する場合は、コンパイルする必要があります。ただし、identity<T>&&が になるとint&&、代わりにエラーが発生します。
コードは GCC 6.0.0 ( demo )でコンパイルされます。
Clang 3.7.0 ( demo ) でのコードのコンパイルに失敗し、次のエラー メッセージが表示されます。
error: no known conversion from 'int'
to 'identity<int> &&' (aka 'int &&') for 1st argument
どちらが正しいですか?