2016-03-23 9 views
4

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?

+0

Ihr Code ist legitim, diese Malignität wird Visual Studio zugeschrieben, da viele Typ-Trait-Mitarbeiter bisher nur teilweise unterstützt werden. – 101010

+0

sowohl gcc und clang kompilieren den Code – bolov

+0

Ich denke, was ist VS VS ist der Methodenzeiger. Es wird nicht als Kompilierzeitkonstante ausgewertet. – bolov

Antwort

3

VS2015 Udpate 2 RC (CL Version 19.00.23824.1) scheint dies zu beheben. Sie können auch mit einer etwas älteren Version unter http://webcompiler.cloudapp.net/ überprüfen, also ich hoffe, es bleibt behoben, wenn das Update RTM geht.

+0

Das letzte Update 3 behebt das Problem immer noch nicht. – sniel

+0

@sniel Ich habe momentan kein Update 3 installiert, aber in VS "15" Vorschau 4 bekomme ich die erwartete 'main.cpp (25): Fehler C2338: TRUE', gleich auf dem Webcompiler. – melak47

Verwandte Themen