如何仅在实际使用成员模板时才在其中静态断言

How to static_assert in member templates only when they are actually used?

本文关键字:在其中 断言 静态 成员 何仅      更新时间:2023-10-16

考虑这个简单的类:

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;
};

它允许从模板类型进行隐式构造,并隐式转换回该类型(一个简单的包装器)。

现在,我不想启用不相关的FooS之间的转换,这是可能的,因为这些隐式构造/转换。我可以将模板化的复制器设为私有的,但我不想通过static_assert发出有用的诊断。

问题是,如Ideone上所示,即使我甚至没有尝试复制类型,static_assert也会失败!在VisualStudio中,我得到了我想要的行为,尽管我认为这是由于VS解析模板的方式。有什么办法让它发挥作用吗?

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

我想你想要这样的东西:

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

似乎std::is_convertable就是解决方案。

发件人http://en.cppreference.com/w/cpp/types/is_convertible:

"如果在返回To的函数的返回语句中可以使用From类型的虚值,也就是说,如果可以使用隐式转换将其转换为To,则提供等于true的成员常数值。否则,值为false。"

相关文章: