Тестирование места хранения статического константного члена

У меня есть

class A  
{  
private:  
    static const int b = 10;  
public:
    static void testReadOnly(int _b)
    {
        const_cast<int &>(A::b) = _b;
    }
};  

и я хочу проверить, является ли переменная-член b инициализируется во время компиляции и поэтому сохраняется в code-segment (Только для чтения).
Для этого я пытаюсь изменить значение b, что должно привести к некоторой ошибке времени выполнения (например, ошибка сегментации, выдаваемая MMU), если она действительно хранится в code-segment,

Я предполагал, что приведенный выше код должен быть собран, но мой компилятор / компоновщик говорит мне undefined reference to 'A::b'

Зачем?

1 ответ

Решение

Поместите определение для статического члена вне объявления класса, чтобы решить ошибки связывания:

class A  
{  
    static const int b = 10;
    ...
};

const int A::b;
~~~~~~~~~~~~~~~

Кроме того, любая модификация константного значения (посредством странных приведений) вызовет неопределенное поведение.

Неопределенное поведение - это неизвестное поведение, иногда вызывающее сбой приложения, иногда нет.

Другие вопросы по тегам