【发布时间】:2023-03-22 18:15:01
【问题描述】:
可能我对explicit的理解不够,但是我想知道为什么在下面的代码中,当我将通用引用构造函数声明为explicit时,复制构造函数没有被通用引用构造函数隐藏。
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)?
【问题讨论】:
-
对于那些感兴趣的人,here 是我根据答案找到的一些解释。
标签: c++ c++11 copy-constructor universal-reference