考虑这个简单的类:
template<class T>
class Foo{
public:
Foo(T const& val)
: _val(val) {}
template<class U>
Foo(Foo<U> const&){
static_assert(false,"Cannot convert from Foo<U> to Foo<T>.");
}
operator T&() { return _val; }
operator T const&() const{ return _val; }
private:
T _val;
};
它允许从模板类型和隐式转换的隐式构造返回到该类型,一个简单的包装器。
现在,我不想在不相关的Foo
之间启用转换,这可能是因为这些隐式构造/转换。我可以将模板化的copy-ctor设为私有,但我不想通过static_assert
发出有用的诊断信息。
问题如here on Ideone所示,即使我甚至没有尝试复制类型,static_assert
也会失败!在Visual Studio中,我得到了我想要的行为,但我认为这是由于VS解析模板的方式。有没有办法让这个工作?
答案 0 :(得分:7)
编译失败,因为编译器可以清楚地看到static_assert
无论如何都会失败。它不以任何方式依赖U
和T
。
我想你想要这样的东西:
static_assert(std::is_same<T,U>::value,"Cannot convert from Foo<U> to Foo<T>.");
答案 1 :(得分:2)
似乎std :: is_convertible是解决方案。
来自http://en.cppreference.com/w/cpp/types/is_convertible:
“如果在返回To的函数的return语句中可以使用类型为From的假想rvalue,也就是说,如果可以使用隐式转换将其转换为To,则提供成员常量值等于true。否则value为false 。“