LINUX.ORG.RU

[C++] Статические константы класса в выражениях

 


0

1

Встретился с непонятным поведением в такой ситуации:

class Foo
{
private:
  static const int kA = 1;
  static const int kB = 2;

public:
  int f(bool b) const { return (b ? kA : kB); }
  int ga() const { return kA; }
  int gb() const { return kB; }
};


int main()
{
  Foo foo;
  std::cout << foo.f(true) << foo.f(false) << foo.ga() << foo.gb() << std::endl;
}

При сборке компилятор ругается на то, что kA и kB не определены в функции Foo::f(bool) const. Почему? Почему эти же константы оказываются определены в функциях ga() и gb()? И почему в выражениях (b ? 0 : kB) и (b ? int(kA) : kB) эти константы тоже определены?


Ответ на: комментарий от ilias

потому, что собирал в выключенной оптимизацией и были обращения к значениям по внешним символам. собирай с -О1/-О2/-О3. такой код противоречит стандарту, т.к. подобная оптимизация допускается, но не требуется.

arsi ★★★★★
()
Ответ на: комментарий от arsi

> ISO/IEC 14882:2003, раздел 9.4.2, пункты 2 и 4.

благодарю

Obey-Kun ★★★★★
()
Ответ на: комментарий от arsi

> такой код противоречит стандарту, т.к. подобная оптимизация допускается, но не требуется.

Почему противоречит? If a static data member is of const integral or const enumeration type, its declaration in the class definition can specify a constant-initializer which shall be an integral constant expression (5.19). In that case, the member can appear in integral constant expressions.

Или (b ? kA : kB) не является константным выражением?

ilias
() автор топика
Ответ на: комментарий от ilias

> Или (b ? kA : kB) не является константным выражением?

Как сие выражение может быть константным? Мозг хоть иногда включать надо.

anonymous
()
Ответ на: комментарий от ilias

> Или (b ? kA : kB) не является константным выражением?

в данном случае не требуется, чтобы это выражение было константным, так что на усмотрение компилятора. в процитированном тексте говорится, что такие константы можно использовать там, где необходимо именно константное выражение:

class Foo {
  // ...
  static const int kA = 1;
  static const int kB = kA + 1; // <--- требуется константное выражение
  // ...
};

кроме того, в этом абзаце после процитированного текста есть ещё одно предложение ;)

arsi ★★★★★
()
Ответ на: комментарий от arsi

Хорошо, тогда почему (b ? kA : kB) требует определения констант, а

int h(int a, int b) const { return a * kA + b * kB; }

нет?

ilias
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.