如何在成员模板中实际使用static_assert?

Xeo*_*Xeo 4 c++ templates member static-assert c++11

考虑这个简单的类:

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;
};
Run Code Online (Sandbox Code Playgroud)

它允许从模板类型隐式构造和隐式转换回该类型,一个简单的包装器.

现在,我不想在不相关的Foos 之间启用转换,这可能是因为这些隐式构造/转换.我可以将模板化的copy-ctor设为私有,但我不想发出有用的诊断信息static_assert.

这个问题,如Ideone所示,static_assert即使我甚至没有尝试复制类型,也会出现问题!在Visual Studio中,我得到了我想要的行为,但我认为这是由于VS解析模板的方式.有没有办法让这个工作?

Naw*_*waz 7

它编译失败,因为编译器可以清楚地看到static_assert无论如何都会失败.它不依赖于UT以任何方式.

我想你想要这样的东西:

static_assert(std::is_same<T,U>::value,"Cannot convert from Foo<U> to Foo<T>.");
Run Code Online (Sandbox Code Playgroud)