Использование N4993 (Примечание: это не текущий стандарт, но он достаточно близок к этому обсуждению).
В разделе «6.3 Правило одного определения [basic.def.odr]»
Пункт 5:
A переменная называется выражением, если выражение является id-выражение, которое его обозначает. Переменная x, имя которой указано в потенциально вычисляемом выражении E, используется E в odr, за исключением случаев, когда
(5.1) -- x является ссылкой, которую можно использовать в константных выражениях (7.7), или
(5.2) -- x — переменная нессылочного типа, которая может использоваться в константных выражениях и не имеет изменяемых подобъектов, а E — элемент множества потенциальных результатов выражение неклассовый тип с энергонезависимой квалификацией, к которому применяется преобразование lvalue-to-rvalue (7.3.2), или
(5.3) -- x — это переменная не-класса, ссылочный тип, а E — это элемент набора потенциальных результатов выражения отброшенного значения (7.2.3), к которому не применяется преобразование lvalue в rvalue.
И
Если локальная сущность используется odr в декларативной области, в которой она
непригодна для использования odr, программа неправильно сформирована.
Рассмотрим следующий код
Код: Выделить всё
#include
using namespace std;
struct A
{
public:
int data;
constexpr A() { data = 0; }
constexpr A(const int& n) :data(n) {}
friend ostream& operator
Подробнее здесь: [url]https://stackoverflow.com/questions/79252600/when-is-x-not-odr-used[/url]
Мобильная версия