Название: [РЕШЕНО] Константное выражение в качестве члена класса. Отправлено: __Heaven__ от Февраль 09, 2017, 10:05 Привет, друзья!
Прошу помочь разобраться, почему не работают методы класса, помеченные как constexpr в коде ниже. Я ожидаю, что вместо вызова метода во время компиляции будет подставлено константное значение. Код
Цитировать undefined reference to `MyStruct::size' Название: Re: Константное выражение в качестве члена класса. Отправлено: Пантер от Февраль 09, 2017, 10:19 static зачем?
Название: Re: Константное выражение в качестве члена класса. Отправлено: __Heaven__ от Февраль 09, 2017, 11:06 Нельзя константное выражение делать членом класса без использования static.
Название: Re: Константное выражение в качестве члена класса. Отправлено: panAlexey от Февраль 09, 2017, 11:10 Код: int MyStruct::width() const Название: Re: Константное выражение в качестве члена класса. Отправлено: __Heaven__ от Февраль 09, 2017, 11:35 Код: int MyStruct::width() const Кажется проблема в QSize, но это не точно. Следующий код работает. Код
Название: Re: Константное выражение в качестве члена класса. Отправлено: __Heaven__ от Февраль 09, 2017, 11:46 Немного ошибся насчёт полной работоспособности предыдущего поста.
Попробовал 4 компилятора (clang, gcc, mingw32, mingw64) Почему-то в gcc подобных код из поста #1 компилится только в release версии. Clang не компилит вообще. Название: Re: Константное выражение в качестве члена класса. Отправлено: ViTech от Февраль 09, 2017, 12:03 Может как-то так надо:
Код
Название: Re: Константное выражение в качестве члена класса. Отправлено: __Heaven__ от Февраль 09, 2017, 12:14 Может как-то так надо: Грязный хак :) но работает)))Код
Но какого лешего не работает исходное решение?? Кстати, компилер странный код генерирует в отсутствие ключей оптимизации. Он будто игнорирует constexpr. См. аттач. Название: Re: Константное выражение в качестве члена класса. Отправлено: ViTech от Февраль 09, 2017, 12:48 Чего это хак, да ещё и грязный :)? Чем MyStruct::size() отличается от Size::width()? Такая же constexpr функция. И если оптимизация не задана пользователем, зачем компилятор будет оптимизировать? Попробуйте следующий код. Без оптимизации и с "-O3", например.
Код
Название: Re: Константное выражение в качестве члена класса. Отправлено: __Heaven__ от Февраль 09, 2017, 13:03 Чего это хак, да ещё и грязный :)? Да я шучу :) Просто я хотел член класса, а вы вжух и метод предложили.Ну, с -O3 он хорошо жмётся, что весьма предсказуемо. Код Кстати, мой код перестаёт компилиться при включении оптимизирующих опций. Видать constexpr это не обязательство, а объявление возможности (как и с inline). Название: Re: Константное выражение в качестве члена класса. Отправлено: __Heaven__ от Февраль 09, 2017, 13:10 Я забыл упомянуть, что за пределами класса константа себя весьма хорошо чувствует - всё штатно.
Название: Re: Константное выражение в качестве члена класса. Отправлено: ViTech от Февраль 09, 2017, 13:15 Там, заодно по идее, и MyStruct::width() тоже должно быть constexpr, тогда сожмётся ещё лучше :).
Код
Название: Re: Константное выражение в качестве члена класса. Отправлено: __Heaven__ от Февраль 09, 2017, 13:24 Дык а некуда дальше))) И так уже просто 20 заносится в регистр и выходит)
Специально не стал делать этот метод constexpr, дабы приблизить пример к тому, что у меня в проекте используется. Название: Re: Константное выражение в качестве члена класса. Отправлено: __Heaven__ от Февраль 09, 2017, 13:31 А зацените это вот :) Получил в результате издёвок над компилером
Код
В объявлении MyStruct нет опечатки это всё компилится Название: Re: Константное выражение в качестве члена класса. Отправлено: ViTech от Февраль 09, 2017, 13:48 Да, чем дальше в С++, тем больше дров ;D. Осталось только не запутаться во всех этих способах инициализации, конструкторах и им подобного ).
Название: Re: [РЕШЕНО] Константное выражение в качестве члена класса. Отправлено: __Heaven__ от Февраль 09, 2017, 14:02 Добавлю для истории, что msvc 2015 такого способа инициализации не одобряет. Проверено для clang, gcc, mingw64.
|