以下のスニペットを検討してください。
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
どちらが正しいですか?