C 暗黙的な変換: ユーザー定義の変換ルールを理解する
以前の応答に対する最近のフィードバックを考慮すると、理解を明確にすることが重要です
次のコード スニペットを考えてみましょう:
<code class="c++">#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 への変換がありますが、これを適用するには複数の変換が必要となり、これは許可されていません。
C 標準 (SC22-N-4411.pdf) のセクション 12.3.4 に答えが記載されています。タイトル 'Conversions':
"4 At most one user-defined conversion (constructor or conversion function) is implicitly applied to a single value."
これは、暗黙的な型変換または初期化中に 1 つの値に適用できる暗黙的なユーザー定義変換 (コンストラクターまたは変換関数) は 1 つだけであることを意味します。
指定されたコードでは、最初の関数呼び出し func("one") は const char* "one" から A への暗黙的な変換を使用しようとしますが、これには 2 つの変換 (const char から 1 つ) が必要なため失敗します。 * から std::string へ、もう 1 つは std::string から A)。他の 2 つの関数呼び出しは、暗黙的な変換がそれぞれ 1 つだけ含まれるため、有効です。
以上がC では、暗黙的な型変換中にユーザー定義変換が 1 つだけ許可されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。