ошибка компиляции литерального класса с конструктором и функцией constexpr (отличается vc, g ++) - PullRequest
0 голосов
/ 03 мая 2018
#include <iostream>
#include <string>
using namespace std;

class A {
public:
    constexpr A() {}
    constexpr int area() {
        return 12;
    }
private:
//  constexpr int h = 3;
//  constexpr int w = 4;
};
int main()
{
    constexpr A a;
    constexpr int j = a.area();
    cout << j << endl;

}

Почему приведенный выше код не может скомпилироваться с компилятором MSVC, пока работает с g ++? Разве MSVC не такой строгий, как другие компиляторы? Разница в результатах между MSVC и g ++ иногда сбивает с толку. На какой компилятор мне следует положиться, кстати, какие-нибудь советы?

enter image description here enter image description here

1 Ответ

0 голосов
/ 03 мая 2018

Проблема в том, что объект constexpr подразумевает const, что означает, что вы не можете вызвать area, поскольку это неконстантная функция. Пометить area как const и все.

Или, сделав a неконстантным, вы можете оставить area неконстантным, что, хотя и странно, допустимо в C ++.

EDIT . Возможно, вы используете C ++ 14 или выше. Ваше впечатление, что функция constexpr подразумевает const, является функцией C ++ 11, которая была изменена в более поздних стандартах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...