MSV C constexpr Ошибка компилятора? - PullRequest
3 голосов
/ 05 февраля 2020

Env: VS 2019, v16.4.3 w / c ++ 17 + последние переключатели

Правильно ли следующий код или я что-то не так делаю? Он прекрасно компилируется с использованием новейших компиляторов gcc / clang, но не работает на MSV C. (см. сообщения об ошибках ниже)

template<typename T>
struct mixin {};

struct thing : mixin<thing>
{
    constexpr explicit thing(int value) : value_(value) {}

    constexpr int value() const { return value_; }

private:
    int value_ = 0;
};

template<typename T>
constexpr auto do_mixin_thing(mixin<T> const& m)
{
    return static_cast<T const&>(m).value() * 10;
}

int main()
{
    constexpr thing t1{ 10 };

    // this works
    static_assert(t1.value() == 10);

    // this fails
    static_assert(do_mixin_thing(t1) == 100);
}

Вот вывод:

error C2131: expression did not evaluate to a constant

message : failure was caused by attempting to access a member on an object of dynamic type 'mixin<thing>' in which the member is not defined

message : see usage of 'thing::value_'

Ошибка относится ко 2-му static_assert в main(), а два сообщения относятся к value() функция-член внутри thing.

Кажется, что static_cast в do_mixin_thing() является причиной проблемы. Я попытался добавить приведение к mixin через constexpr T const& self() const { return static_cast<T const&>(*this); }, но ошибка остается.

...