C 暗黙的変換
C のコンテキストでは、暗黙的変換の概念が議論の対象となってきました。 「C で使用できる他の便利なキャストは何ですか?」に関する最近の回答
次のコード スニペットを考えてみましょう。
<code class="cpp">#include <string> struct A { A(const std::string &s) {} }; void func(const A &a) { } int main() { func("one"); // error func(A("two")); // ok func(std::string("three")); // ok }</code>
このスニペットでは、最初の関数呼び出し func("one") の結果は次のようになります。エラーです。これは、const char * から A への直接変換がないためです。文字列から A への変換はありますが、それを使用すると複数の暗黙的な変換が必要となり、C 標準に従って許可されていません。
C 標準 (SC22-N-4411.pdf) のセクション 12.3.4「変換」には次のように記載されています:
4 At most one user-defined conversion (constructor or conversion function) is implicitly applied to a single value.
これは、変換を実行するときに適用できる暗黙的なユーザー定義変換は 1 つだけであることを意味します。最初の関数呼び出しでは、const char * から string への変換と string から A への変換の両方がユーザー定義の変換です。複数の変換が必要なため、コンパイラはエラーを発生させます。
以上が`func(\"one\")` が C の暗黙的な変換でエラーを引き起こすのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。