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>
最初に述べたように、const char* から A への直接変換がないため、最初の関数呼び出しはエラーになります。文字列から A への変換が存在する場合、それを利用するには 2 つの連続した変換が必要になります。
C 標準 (SC22-N-4411.pdf) のセクション 12.3.4 によると、「変換」:
"最大 1 つのユーザー定義変換 (コンストラクターまたは変換関数) が 1 つの値に暗黙的に適用されます。"
これは、指定されたコードでは、コンパイラーが A(const std: の両方のコンストラクターを暗黙的に適用できないことを意味します) :string &) と、const char* から std::string (その後、A に変換される) から引数 "one" への暗黙的な変換です。
したがって、最初の関数呼び出しは次のようになります。エラーとなる結果は正しいです。 C 標準では、暗黙的なユーザー定義変換は 1 つだけ許可されるため、コンパイラーが関数のパラメーターの型を満たすために必要な手順を実行できなくなると明示的に規定されています。
以上がC の単一操作で複数の暗黙的な変換を適用できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。