在回答这个问题大约要建一个可变参数转发参考构造函数,如果没有其他的构造是有效的只应被调用.也就是说,如果有:
C(const char*, size_t) { } // 1
template <typename... T, ???> C(T&&... ) { } // 2
Run Code Online (Sandbox Code Playgroud)
我们想要C c1{"abc", 2};调用(1),尽管需要转换,但是C c2{1, 2, 3};要调用(2),因为(1)不能应用.
我提出了以下解决方案:
template <typename... T,
typename = std::enable_if_t<!std::is_constructible<C, T&&...>::value>
>
C(T&&... ) { }
Run Code Online (Sandbox Code Playgroud)
通过提议,我的意思是,我尝试了它,并惊讶地发现它确实有效.它编译并完成我在gcc和clang上所希望的.不过,我很茫然,解释为什么它的工作原理,甚至如果它实际上应该工作,gcc和铛都只是是特别适应.是吗?为什么?