Что значит «использовать ODR»?

Это только что произошло в контексте еще один вопрос .

Очевидно, функции-члены в шаблонах классов создаются только в том случае, если они используются ODR. Может кто-нибудь объяснить, что именно это значит. В статье в Википедии об одном правиле определения (ODR) не упоминается « использование ODR ».

Однако стандарт определяет его как

  

Переменная, имя которой появляется в качестве потенциально оцененного выражения    odr-used , если это не объект, который удовлетворяет требованиям для   появляется в константном выражении (5.19) и lvalue-to-rvalue   преобразование (4.1) применяется немедленно.

в [basic.def.odr].

Редактировать: очевидно, это неправильная часть, и весь абзац содержит несколько определений для разных вещей. Это может быть релевантным для функции-члена шаблона класса:

  

Не перегруженная функция, имя которой отображается в виде   потенциально оцениваемое выражение или член набора кандидатов   функции, если выбрано разрешением перегрузки при обращении к   потенциально оцененное выражение, используется odr, если оно не является чистым   Виртуальная функция и ее имя явно не определены.

Однако я не понимаю, как работает это правило для нескольких модулей компиляции? Все ли функции-члены создаются, если я явно создаю шаблон класса?

70 голосов | спросил Sarien 28 +04002013-10-28T12:58:46+04:00312013bEurope/MoscowMon, 28 Oct 2013 12:58:46 +0400 2013, 12:58:46

1 ответ


0

Проще говоря, odr-used означает, что что-то (переменная или функция) используется в контексте, где должно присутствовать его определение.

например,

struct F {
   static const int g_x = 2;
};

int g_x_plus_1 = F::g_x + 1; // in this context, only the value of g_x is needed.
                             // so it's OK without the definition of g_x

vector<int>  vi;
vi.push_back( F::g_x );      // Error, this is odr-used, push_back(const int & t) expect
                             // a const lvalue, so it's definition must be present

Обратите внимание, что вышеуказанный push_back передан в MSVC 2013, это поведение не соответствует стандарту, как gcc 4.8.2, так и clang 3.8.0 не удалось, сообщение об ошибке: неопределенная ссылка на `K :: g_x '

ответил zhaorufei 8 AM00000030000002031 2017, 03:58:20

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132