最近の私の答えであるWhat other useful casts can be used in 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
}
を最初の関数呼び出しがエラーであるA.へのconstのchar *からの変換はありませんbecauuse、からの変換があるということでした文字列をAに変換しますが、これを使用すると複数の変換が行われます。私はこれが許されないと理解しています。これはg ++ 4.4.0 &コモコンパイラによって確認されたようです。コモーで、私は次のエラーを取得する:
"ComeauTest.c", line 11: error: no suitable constructor exists
to convert from "const char [4]" to "A"
func("one"); // error
あなたは、好ましくは、C++標準を参照して、ここでもか、元の答えに、私は間違っているところ、指摘することができた場合は、そうしてください。
そして、C++標準からの答えのようだ:引用符を提供するためのアブヘイに
At most one user-defined conversion (constructor or conversion function) is implicitly applied to a single value.
感謝。
申し訳ありませんが、私はあなたの答えにコメントに間違っていた。私は "オーバーロードの解像度は、呼び出されるユーザー定義の変換を選択するために使用されます"と私は自分自身に言った、それはA(文字列const&)に解決し、 "1"を渡すが、 13.3.3.1.2は、「ユーザ定義の変換シーケンスは、最初の標準変換シーケンスの後に ユーザ定義変換(12.3)が続き、その後に2番目の標準変換シーケンスが続くことから構成されています。しかし、 "one" - > stringは標準の変換シーケンスではありませんが、別のユーザ定義の変換シーケンスが必要です! –
ちょうど私の大理石を失っていない限り:-) –
大きな質問!この議論は、 'std :: string'は言語の一部ではなく、それとの変換は「ユーザ定義」であることを意味します。少なくともそれは私の理解です。私が間違っていれば私を修正してください。質問がこれについてもっと明白であればいいだろう。 'std :: string'の正確な状態は、古いC++の手にとっては明快かもしれませんが、今世紀にこの言語に来た人にとってはそれほど簡単ではありません。 –