Форум программистов, компьютерный форум CyberForum.ru

Как компилятор обрабатывает член класса static constexpr const char* - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Из однонаправленного списка сделать двунаправленный список http://www.cyberforum.ru/cpp/thread1808296.html
понимаю, что мне нужен указатель на предыдущий элемент. но что с ним делать, и что делать в главной программе, не понимаю, помогите, пожалуйста #include <iostream> #include <fstream> #include <string> #include <conio.h> using namespace std; // Структура — элемент списка struct node { string surname;
C++ Преобразовать заданные строки, согласно условию (сортировка и сравнение строк, вставка/удаление символов) Даны строки A и B. Если все символы A входят в B и в B есть повторяющиеся символы, то упорядочить символы B в порядке, обратном к алфавитному, удалив повторяющиеся символы, и удалить русские буквы из A; в остальных случаях удалить из A символы, не входящие в B, и продублировать цифры в B. Помогите очень прошу) последняя лаба из долгов по сессии((( http://www.cyberforum.ru/cpp/thread1807743.html
C++ Получить график дат санитарных дней в указанном году
задача: Городской рынок имеет санитарный день каждый понедельник месяца . Дано номер года и указано день недели , на который приходится 1 января. Получить график дат санитарных дней в указанном году. Помогите пожалуйста решить задачу
C++ Распознование животных на изображении
Стала интересна тема распознавания образов на изображениях. Программа должна получать картинку с животным и определить какое это животное(как я понимаю, задача не простая, но все же) . Подскажите в какую сторону копать, какие есть статьи/книги/сайты посвященные этой теме. Слышал про OpenCV, но я уверен, что есть еще что-то похожее.
C++ Как число типа 2.88007e+018 привести в обычный int, float или просто вывести http://www.cyberforum.ru/cpp/thread1807404.html
Тестирующая система говорит "Неправильный формат вывода". Программа считает числа фиббоначи, по формуле Бине (дается только n, найти значение). #include <iostream> #include <math.h> using namespace std; int main() { int n; cin >> n;
C++ Как подружить компьютер c МК через USB Здравствуйте, уважаемые форумчане! Никогда не работал с USB нужна помощь. Есть компьютер под управлением Windows 7, плата разработки DE0-Nano-SoC. Необходимо написать программу для ОС, которая могла бы определять плату как USB устройство. В DE0-Nano-SoC есть два USb-интерфейса UART to USB (COM-порт) и USB OTG (FT232R). Думаю подключать через USB OTG. Пишу как в Microsoft Visual Stidio... подробнее

Показать сообщение отдельно
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
3365 / 1687 / 448
Регистрация: 18.10.2014
Сообщений: 3,094
21.09.2016, 08:34     Как компилятор обрабатывает член класса static constexpr const char*
Цитата Сообщение от Evg Посмотреть сообщение
Я правильно понимаю ситуацию? Сначала (условно в C++98) разрешили писать инициализатор в теле класса ради того, чтобы static-поле класса можно было, грубо говоря, использовать в качестве размерности НЕавтоматического массива. Для указателей подобной необходимости не было, а потому не разрешали. Теперь (с C++11) из-за constexpr появилась необходимость использовать указатель (как rvalue) в других constexpr выражениях в НЕавтоматических местах, растущих от других constexpr'ов. Типа того?
Ну да. Типа того.

В С++98 (и С++03) возможность использования static const членов класса в качестве констант времени компиляции понимали (отсюда разрешение на указание инициализаторов для целых и enum типов), но это возможность все равно рассматривалась, как "вторичная". Например, правила ODR в С++98 формально требовали отдельного определения такого члена класса, если он использовался (used) в программе. При этом не придавалось никакого значения тому, как он использовался. Даже если static const использовался только как rvalue (напр. только для задания размера массива), все равно наличие определения безусловно требовалось спецификацией языка. Хотя понятно, что с точки зрения здравого смысла такое определение было никому не нужно. (Многие компиляторы натуральным образом не следили за соблюдением этого требования, если такая константа использовалась только как rvalue).

В С++11 возможность использования таких констант именно и только как констант времени компиляции уже вышла на первый план. Правила ODR были модифицированы и требуют отдельного определения static const членов класса только если они odr-используются (odr-used) в программе, т.е. если они где-то используются именно как lvalue. А если такая константа используется только как rvalue, то делать для нее отдельное определение больше не требуется.

Но дальше расширять функциональность static const не стали (возможно, там скрыты какие-то конфликты), т.е. указывать инициализаторы для static const прямо в классе по-прежнему можно только для целых и enum типов. Вместо этого для создания констант времени компиляции ввели совершенно новый механизм constexpr. Для constexpr констант указывать инициализаторы прямо в классе можно всегда, независимо от типа. Понятно, что наличие видимых отовсюду инициализаторов совершенно необходимо для того, чтобы обрабатывать такие константы на стадии компиляции.
 
Текущее время: 00:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru