использовать constexpr со статической в ​​круговой инициализации? - PullRequest
0 голосов
/ 02 января 2019

Я пытался понять, как использовать constexpr из разных источников. Но у меня есть проблема, я хочу преобразовать программу ниже, чтобы использовать constexpr вместо const. Эта программа является шаблоном моей основной программы.

class B;

class A{
public:
constexpr A(int){}
const static B& obj;
};

class B:A{
public:
    constexpr B(int x):A(x){}
    const static B& obj;
};

const B& A::obj=B(10);
const B& B::obj=B(20);

В последней строке я хочу использовать constexpr, чтобы гарантировать, что эта переменная obj присутствует во время компиляции и, таким образом, уменьшить мой размер кода и оптимизировать, но в соответствии со стандартами constexpr не может быть использован. И это дает ошибку о нескольких объявлениях. И если я изменю const в классе A, то инициализация обязательна. Я хочу использовать переменную obj в функции constexpr, и, поскольку obj отсутствует в ошибке времени компиляции. Я спрашиваю, как я могу решить проблему, потому что, если это не может быть сделано, то, вероятно, на оптимизацию кода влияют 15%, что действительно огромно.

1 Ответ

0 голосов
/ 03 января 2019

Поскольку constexpr применяет постоянство к определенному объекту, вы можете использовать constexpr перед const в последней строке или в последних двух строках (если вы действительно этого хотите), например, так.

constexpr const B& A::obj=B(10);
constexpr const B& B::obj=B(20);

Это работает.Смотрите скомпилированную демонстрацию здесь .

...