Wenn ich wirklich verhindern wollte, dass eine solche Funktion einen Zeiger übergeben würde, würde ich dies in C++ 11 tun;
void foo(bool);
template<class T> void foo(T *) = delete;
void bar()
{
foo("Hello");
}
, die einen Compilerfehler auslösen wird.
Vor C++ 11 (nicht jeder kann aus verschiedenen Gründen aktualisieren) ist eine Technik;
void foo(bool);
template<class T> void foo(T *); // note no definition
void bar()
{
foo("Hello");
}
und dann haben die Definition von foo(bool)
irgendwo (in einer und nur einer Übersetzungseinheit in Ihrem Build). Für die meisten Toolchains, die einen traditionellen Compiler und Linker verwenden (was die meisten Toolchains in der Praxis sind, einschließlich der meisten Installationen von g ++), wird der Linker-Fehler durch foo<char const>(char const*)
verursacht, der nicht definiert ist. Der genaue Wortlaut des Fehlers ist linkerabhängig.
Beachten Sie, dass die Fehler von einem Entwickler bewusst umgangen werden können. Aber solche Techniken werden die versehentliche Verwendung stoppen.
Wenn Sie zulassen möchten, dass ein Zeiger außer char const *
übergeben wird, deklarieren Sie einfach void foo(const char *)
wie oben und deklarieren Sie die Vorlage nicht.
Versuchen Sie '-Wimplicit' –
Es ist nicht nur für Zeichenliterale und Zeiger auf Zeichen, die davon betroffen sind, aber * alle * Zeiger sind implizit in' bool' umwandelbar. –
Wenn * ein Raw-String-Literal als Argument * ist das einzige Problem, das Sie hinzufügen können ein 'void foo (const char *) = löschen;' Überladung –