constexpr bug,std :: is_same具有多重继承

时间:2016-03-23 08:00:58

标签: c++11 constexpr typetraits

使用VS2015进行编译:

template <typename Owner, typename C, typename R, typename... Args>
constexpr bool FunctionBelongsTo(R(C::*)(Args...) const)
{
  return std::is_same<C, Owner>::value;
}

class C
{
public:
  int x;
};
class D
{
public:
  int y;
};
class M : public C, public D
{
public:
  void f() const {}
};

static_assert(FunctionBelongsTo<M>(&M::f) != true, "TRUE");

constexpr函数给出了一个奇怪的错误:

error C2131: expression did not evaluate to a constant
note: a non-constant (sub-)expression was encountered

这个std::is_same表达式肯定是不变的。

奇怪的是,在M被多重继承的这种非常具体的情况下,似乎会调用此错误。从M中删除任何一个基类并且它编译得很好(即,它按预期发出static_assert),但是当M像这样多次继承时,它会决定表达式并不是一成不变的。

...给出了什么?菜鸟错误?

1 个答案:

答案 0 :(得分:3)

VS2015 Udpate 2 RC(CL版本19.00.23824.1)似乎解决了这个问题。您还可以在http://webcompiler.cloudapp.net/处使用较旧的版本进行验证,因此我希望在更新进入RTM时它会保持不变。