次のコードを検討してください。
#include <vector>
struct A
{
explicit A(int i_) : i(i_) {}
int i;
};
int main()
{
std::vector<int> ints;
std::vector<A> As(ints.begin(), ints.end());
}
上記はコンパイルする必要がありますか?コンストラクターがマークされているため、そうすべきではないと感じていexplicit
ます。
Microsoft Visual C++ はこれに同意し、明確なエラー メッセージを表示します。cannot convert from 'int' to 'const A'; Constructor for struct 'A' is declared 'explicit'
ただし、Comeau のオンライン コンパイラを使用すると、コードは正常にコンパイルされます。
どちらが正しい?
編集:
興味深いことに、(A に an を追加した後に) に変更vector
すると、両方のコンパイラでエラーが発生します。set
operator <
ただし、とを変更vector<int>
するmap<int, int>
と、両方のコンパイラがコードを受け入れるようになります!vector<A>
map<A, A>