mit VS2015 kompilieren:constexpr Fehler, std :: is_same mit Mehrfachvererbung
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");
Die constexpr
Funktion gibt einen seltsamen Fehler:
error C2131: expression did not evaluate to a constant
note: a non-constant (sub-)expression was encountered
Dieser std::is_same
Ausdruck ist sicherlich konstant.
Die seltsame Sache ist, dieser Fehler scheint in diesem sehr speziellen Fall aufgerufen werden, wo M
mehrfach vererbt wird. Entfernen Sie eine der Basisklassen von M
und es kompiliert nur gut (dh, es gibt die static_assert
, wie erwartet), aber wenn M
ist mehrfach vererbt wie folgt, es entscheidet der Ausdruck ist nicht konstant.
... was gibt's? Anfängerfehler?
Ihr Code ist legitim, diese Malignität wird Visual Studio zugeschrieben, da viele Typ-Trait-Mitarbeiter bisher nur teilweise unterstützt werden. – 101010
sowohl gcc und clang kompilieren den Code – bolov
Ich denke, was ist VS VS ist der Methodenzeiger. Es wird nicht als Kompilierzeitkonstante ausgewertet. – bolov