C++ 暗黙の変換 質問する

C++ 暗黙の変換 質問する

私の最近の回答に対するコメントがいくつかありました。C++で使用できる他の便利なキャストは、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
}

私の主張は、const char * から A への変換がないため、最初の関数呼び出しがエラーであるということです。文字列から A への変換はありますが、これを使用すると複数の変換が必要になります。私の理解では、これは許可されていないようですが、これは g++ 4.4.0 および Comeau コンパイラによって確認されているようです。Comeau では、次のエラーが発生します。

"ComeauTest.c", line 11: error: no suitable constructor exists 
      to convert from "const char [4]" to "A"
      func( "one" );                    // error

私が間違っている箇所を、ここでも元の回答でも、できれば C++ 標準を参照して指摘していただければ幸いです。

C++ 標準からの答えは次のようになります。

最大 1 つのユーザー定義変換 (コンストラクターまたは変換関数) が単一の値に暗黙的に適用されます。

引用を提供してくれたAbhayに感謝します。

ベストアンサー1

sharptooth さんの回答は正確だと思います。C++ 標準 (SC22-N-4411.pdf) のセクション 12.3.4 の「変換」では、暗黙的なユーザー定義の変換は 1 つだけ許可されることが明記されています。

1 クラスオブジェクトの型変換は、コンストラクタと変換関数によって指定できます。これらの変換はユーザー定義の変換と呼ばれ、暗黙の型変換 (第 4 項)、初期化 (8.5)、および明示的な型変換 (5.4、5.2.9) に使用されます。

2 ユーザー定義の変換は、明確な場合にのみ適用されます (10.2、12.3.2)。変換はアクセス制御ルールに従います (条項 11)。アクセス制御は、あいまいさの解決後に適用されます (3.4)。

3 [注: 関数呼び出しにおける変換の使用に関する説明と以下の例については、13.3 を参照してください。—注記終了]

4 最大 1 つのユーザー定義変換 (コンストラクターまたは変換関数) が 1 つの値に暗黙的に適用されます。

おすすめ記事