#include <iostream>
struct S
{
const int a = 10;
};
int main()
{
S s1;
S s2;
std::cout<<&s1.a<<'\n';
std::cout<<&s2.a<<'\n';
}
output:
0x7787a69678f0
0x7787a6967900
Необходимость константного нестатического обьекта заключается не в том, что так решили авторы языка, а авторы языка создали возможность иметь константный обьект в локальной области памяти или в статической области. В первом случаи время жизни обьекта заканчивается при выходе из области, а втором - обьект живет до конца программы. И когда вы выбираете между статическим и нестатическим обьектом, должны учитывать именно этот факт. Например, если немного изменить вашу структуру, то сразу прояснится разница:
struct S
{
static const int sa = 10;
const int a = 10;
S(int n = 10) : a(n) {}
void print() const {
cout << "non static member: " << a << endl
<< "static member" << sa << endl << endl;
}
};
Нестатическую константу вы можете инициализировать инициализатором конструктора, а статическая константа не принадлежит обьекту, она принадлежит статической области памяти, и для всех обьектов этот обьект единственный и имеет одно и то же значение:
S s1, s2(2), s3(3);
s1.print(); // a == 10, sa == 10
s2.print(); //a == 2, sa == 10
s3.print(); //a == 3, sa == 10
Можно привести еще много примеров, где правильно или лучше использовать нестатическую константу или наоборот, но я надеюсь и этот пример достаточен, чтобы понять почему константа не статическая(если конечно не обьялен как статическая)
Потому что значения const полей можно устанавливать в конструкторе (в списке инициализации членов), так что у разных объектов они могут быть разные.
struct S
{
const int a;
S(int value) : a(value) {}
};
int main()
{
S s1(1);
S s2(2);
std::cout << s1.a << '\n'; // 1
std::cout << s2.a << '\n'; // 2
}
Потому что у тебя в стеке создались две структуры и каждая из них имеет свою константу
Потому, что так решили авторы языка.
C++ - это не тот язык, в котором компилятор будет додумывать, что же хотел сказать программист? Тут все проще: сказано - сделано (если сказанное явно не запрещено в стандарте).
Хочешь не статический член-константу - получи. Кто тебя знает, зачем это тебе? Вдруг действительно надо.
А хочешь статический - опиши явно.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей