Visual Studio 2015でコンパイルに失敗したC++ 11コードを、コンパイルする必要があると思われる以下のコードを削除しました(clangとgccで行います):Visual C++:ポインタを配列として転送
#include <utility>
void test(const char* x);
int main()
{
const char x[] = "Hello world!";
test(std::forward<const char*>(x));
}
ここではforward
への呼び出しは必要ないと思います。これは、より複雑なコードから切り捨てられ、可変引数の配列をポインタにまで減衰させ、すべてを転送します。私は確かにテンプレートの専門化やSFINAEでこれを回避する方法を見つけることができますが、私はその道を行く前に、それが有効なC++かどうかを知りたいと思います。コンパイラはVisual Studio 2015で、問題はon this online MSVC compilerを再現できます。コンパイルエラーは、次のとおりです。
main.cpp(13): error C2665: 'std::forward': none of the 2 overloads could convert all the argument types
c:\tools_root\cl\inc\type_traits(1238): note: could be '_Ty &&std::forward<const char*>(const char *&&) noexcept'
with
[
_Ty=const char *
]
c:\tools_root\cl\inc\type_traits(1231): note: or '_Ty &&std::forward<const char*>(const char *&) noexcept'
with
[
_Ty=const char *
]
main.cpp(13): note: while trying to match the argument list '(const char [13])'
更新:@Yakkはもっとこのように例を示唆している
:再び
main.cpp(7): error C2664: 'void test(const char *&&)': cannot convert argument 1 from 'const char [13]' to 'const char *&&'
main.cpp(7): note: You cannot bind an lvalue to an rvalue reference
:より有益なエラーが発生します
void test(const char*&& x);
int main()
{
const char x[] = "Hello world!";
test(x);
}
これはgccとclangでコンパイルされます。 Visual C++のコンパイラフラグは/EHsc /nologo /W4 /c
でした。 @Crazy Eddieは、非const参照として一時変数を渡すためにこれがVC++の拡張機能になっている可能性があることを示唆しています。
ポインタが実際には一時的なので、2番目のバージョンと一致しないことが予想されます。 –
コンパイラは厳密なC++モードですか?*任意の*拡張機能が有効になっていますか? – Yakk
これは、 'void test(const char * &&){} const char bob [] =" hello "のような簡単な例です。テスト(ボブ); '? – Yakk