struct Value
以下のコードが代わりに出力される理由がわかりませんint
(これは、変換コンストラクターがではValue
なくに変換していることを意味しint
ます)。(Visual C ++ 2012)
なぜこうなった?Value(int)
コンパイラがコンストラクタを完全に無視するのはなぜですか?
#include <iostream>
#include <type_info>
using namespace std;
struct Value { Value(int) { } };
struct Convertible
{
template<class T>
operator T() const
{ throw typeid(T).name(); }
};
int main()
{
try { Value w((Convertible())); }
catch (char const *s) { cerr << s << endl; }
}
編集:
さらに奇妙なのはこれです(今回はC ++ 11のみ、GCC 4.7.2):
#include <iostream>
#include <typeinfo>
using namespace std;
struct Value
{
Value(Value const &) = delete;
Value(int) { }
};
struct Convertible
{
template<class T>
operator T() const
{ throw typeid(T).name(); }
};
int main()
{
try { Value w((Convertible())); }
catch (char const *s) { cerr << s << endl; }
}
これは次のようになります。
source.cpp: In function 'int main()':
source.cpp:21:32: error: call of overloaded 'Value(Convertible)' is ambiguous
source.cpp:21:32: note: candidates are:
source.cpp:9:3: note: Value::Value(int)
source.cpp:8:3: note: Value::Value(const Value&) <deleted>
コピーコンストラクターが削除された場合、なぜあいまいさがありますか?!