可能我對explicit
的理解不夠,但是我想知道爲什麼在下面的代碼中,當我聲明後者爲explicit
時,複製構造函數不會被非反參考構造函數隱藏。C++顯式通用引用構造函數不隱藏複製構造函數?
struct A
{
A() = default;
template<typename T>
A(T&& t) { std::cout<<"hides copy constructor"<<std::endl; }
};
struct A_explicit
{
A_explicit() = default;
template<typename T>
explicit A_explicit(T&& t) { std::cout<<"does not hide copy constructor?"<<std::endl; }
};
int main()
{
A a;
auto b = a; (void) b; //prints "hides copy constructor"
A_explicit a_exp;
auto b_exp = a_exp; (void) b_exp; //prints nothing
}
那是一個通用的解決方案,而不是SFINAE東西,一個原本適用於防止躲在A
(例如通過std::enable_if_t<!std::is_same<std::decay_t<T>, A>::value>
,見here)?
對於那些有興趣,[這裏](http://en.cppreference.com/w/cpp/language/converting_constructor)是我根據答案找到的一些解釋。 – davidhigh