Ich habe einige C++ 11 Code, der auf Visual Studio 2015 zu kompilieren fehlgeschlagen, die ich kompilieren sollte (und macht mit Clang und GCC):Visual C++: ein Array als Zeiger weiterleiten
#include <utility>
void test(const char* x);
int main()
{
const char x[] = "Hello world!";
test(std::forward<const char*>(x));
}
Ich verstehe den Anruf zu forward
ist hier nicht notwendig. Dies wird von einem viel komplexeren Code-Code abgeschnitten, der beliebige Arrays in einem variadischen Argument in Zeiger zerlegt und alles weiterleitet. Ich bin mir sicher, dass ich Möglichkeiten finden kann, um mit Template-Spezialisierung oder SFINAE zu umgehen, aber ich würde gerne wissen, ob es C++ gültig ist, bevor ich diesen Weg gehe. Der Compiler ist Visual Studio 2015 und das Problem kann on this online MSVC compiler neu erstellt werden. Der Compiler-Fehler ist:
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])'
Update:
@Yakk ein Beispiel eher wie diese vorgeschlagen hat:
void test(const char*&& x);
int main()
{
const char x[] = "Hello world!";
test(x);
}
der einen informativen Fehler gibt:
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
Wieder , dies kompiliert auf gcc und clang. Die Compilerflags für Visual C++ waren /EHsc /nologo /W4 /c
. @Crazy Eddie schlägt vor, dass dies möglicherweise auf eine VC++ Erweiterung zurückzuführen ist, um Provisorien als nicht konstante Referenzen zu übergeben.
Ich würde erwarten, dass es nicht mit der zweiten Version übereinstimmen, weil der Zeiger tatsächlich eine temporäre ist. –
Ist Ihr Compiler im strikten C++ - Modus oder sind * beliebige * Erweiterungen aktiviert? – Yakk
Ein einfacheres Beispiel, das den Unterschied zeigt, ist 'void test (const char * &&) {} const char bob [] =" Hallo "; Test (Bob); '? – Yakk