2016-03-23 3 views
4

Compiling с VS2015:constexpr ошибка, станд :: is_same с множественным наследованием

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 многократно унаследовано, он решает, что выражение не является постоянным.

... что дает? Ошибка новичков?

+0

Ваш код является законным, эта злокачественность приписывается визуальной студии, так как до сих пор только частично поддерживается поддержка нескольких типов персонажей. – 101010

+0

как gcc, так и clang компилируют код – bolov

+0

Я думаю, что возится VS - это указатель метода. Он не оценивает его как постоянную времени компиляции. – bolov

ответ

3

VS2015 Udpate 2 RC (версия CL 19.00.23824.1), кажется, исправить это. Вы также можете проверить несколько более старую версию на http://webcompiler.cloudapp.net/, поэтому я надеюсь, что она останется фиксированной, когда обновление пройдет RTM.

+0

Последнее обновление 3 все еще не устраняет проблему. – sniel

+0

@sniel У меня нет обновления 3, установленного на данный момент, но в VS "15" Preview 4 я получаю ожидаемый 'main.cpp (25): ошибка C2338: TRUE', то же самое на веб-компилере. – melak47