Описание тега one-definition-rule

Все, что связано с C++ One Definition Rule (ODR), то есть правилом стандарта C++, запрещающим множественные определения большинства языковых объектов. ODR примерно требует, чтобы большинство языковых сущностей (объекты, функции, шаблоны и т. Д.) Имели уникальное (не дублированное) определение в одной и той же единице перевода или во всей программе, в то время как несколько объявлений все еще возможны.
1 ответ

Входят ли аргументы шаблона по умолчанию в правило с одним определением?

Могут ли несколько единиц перевода иметь объявления одного и того же шаблона с разными аргументами шаблона по умолчанию, но с одинаковым определением? Например, нарушает ли следующий код ODR, если единицы перевода в b.cpp а также c.cpp связаны вмест…
01 ноя '13 в 15:14
1 ответ

Чистая реализация виртуальной функции

Я читаю " Эффективный C++" Скотта Мейерса, и я нахожусь в разделе о наследовании. Он сказал, что Чистые виртуальные функции определяют только наследование интерфейса. Простые (нечистые) виртуальные функции определяют наследование интерфейса плюс нас…
1 ответ

Условные определения структур C/C++

Я наткнулся на некоторый код, который выглядит так: typedef struct SomeStruct { int foo; void * bar; #if defined(__cplusplus) SomeStruct(); #endif } SomeStruct; Он находится в заголовочном файле, который будет включен в файлы.c и.cpp. Это, по крайне…
04 дек '16 в 17:19
2 ответа

Встроенные конструкторы и одно правило определения

Рассмотрим следующие исходные файлы 1.cpp #include <iostream> using namespace std; struct X { X() { cout << "1" << endl; } }; void bar(); void foo() { X x; } int main() { foo(); bar(); return 0; } файле 2.cpp #include <cstdio&gt…
22 фев '12 в 06:15
1 ответ

Ортогональная регрессия расстояния в 3d

Кто-нибудь знает, как найти лучшую подходящую линию для точечного рисунка в 3d?Меня интересует так называемая линия ODR (регрессия ортогонального расстояния), которая минимизирует сумму евклидовых расстояний всех точек линии. Есть ли функция r для э…
15 авг '11 в 08:34
2 ответа

Использование `__DATE__` или`__TIME__` нарушает правило одного определения?

Когда используешь __DATE__ или же __TIME__ в заголовочном файле результаты препроцессора для включения этого заголовка могут несколько отличаться. При каких обстоятельствах использование __DATE__ или же __TIME__ в заголовочном файле нарушать правило…
1 ответ

Строки в заголовках - это нарушает ODR?

Рассмотрим следующую программу с двумя модулями компиляции. // a.hpp class A { static const char * get() { return "foo"; } }; void f(); // a.cpp #include "a.hpp" #include <iostream> void f() { std::cout << A::get() << std::endl; } …
1 ответ

C++ - определение функции-члена вне шаблона-класса, но в заголовке

Я определил простой шаблон класса с одной функцией-членом. Он определен вне класса с дополнительной (явной) специализацией, также определенной вне класса. Все в одном заголовочном файле. Если вы включите этот заголовок в несколько блоков перевода, в…
10 окт '14 в 17:59
1 ответ

Ошибка ODR в MSVC?

Эта программа печатает 1 1 вместо 1 2 при компиляции с MSVC (до VS 2015). f1.cpp: #include <functional> static std::function<int ()> helper() { struct F { int operator()() { return 1; } }; return F(); } std::function<int ()> f1() {…
05 ноя '15 в 12:50
1 ответ

ODR шаблонного класса со статическим членом constexpr

Я знаю, что есть много ответов на вопрос о связывании статических (constexpr) членов. Но мне интересно, почему использование внепланового определения класса шаблона работает в заголовочном файле, но не для специализированного класса. а) Это работает…
14 фев '17 в 07:57
1 ответ

Шаблонный трюк для определения глобального массива в заголовке

Я наткнулся на такой трюк: // This template utilizes the One Definition Rule to create global arrays in a header. template<typename unused=void> struct globals_struct { static const uint8 s_str_serialize_flags[256]; // ... }; typedef globals_s…
1 ответ

Статический констекстер одр-используется или нет?

Почему это работает на gcc но не на clang( посмотреть его вживую ): constexpr int giveMeValue() { return 42; } struct TryMe { static constexpr int arr[1] = { giveMeValue() }; }; int main() { int val = TryMe::arr[0]; return val; } Я получаю неразреше…
04 окт '14 в 18:58
1 ответ

Ссылка на библиотеку, которая ссылается на библиотеку, на которую я уже ссылаюсь

Прости запутанный заголовок. Настройка для этой проблемы заключается в следующем: У меня есть библиотека с открытым исходным кодом, которую я встроил в кучу.libs (VTK, если вам интересно) У меня есть библиотека, которая использует вышеупомянутую ста…
1 ответ

Используется ли статическая переменная constexpr odr?

Дать код ниже, это Foo::FOO1 Используется ODR или нет? #include <iostream> #include <map> #include <string> class Foo { public: static constexpr auto FOO1 = "foo1"; void bar(); }; void Foo::bar() { const std::map<std::string, in…
10 сен '18 в 05:53
1 ответ

Оптимизация для используемых ODR пустых классов

Многие из сегодняшнего кода C++, как правило, загружаются шаблонами в наибольшей степени. Это библиотеки: STL, Boost.Spirit, Boost.MPL и другие. Они поощряют пользователей объявлять функциональные объекты в форме struct S { /* presence of non-virtua…
0 ответов

Проблемы с использованием scipy.odr с math.erf()

У меня проблема с использованием регрессии ортогонального расстояния с функцией, использующей функцию ошибки math.erf(), Чтобы быть более ясным, кажется, у меня есть проблема с переменными, которые должны соответствовать. import numpy as np from sci…
01 сен '18 в 18:47
1 ответ

Может ли встроенная функция в заголовочном файле использовать константу, которая имеет внутреннюю связь?

Рассмотрим следующий код: const int a = 0; const std::string b = "hi"; inline void f_a1() { std::cout << a; } inline void f_b1() { std::cout << b; } inline void f_a2() { std::cout << &a; } inline void f_b2() { std::cout <&lt…
27 фев '15 в 13:17
2 ответа

Может ли использование лямбды в заголовочных файлах нарушать ODR?

Можно ли в заголовочном файле записать следующее: inline void f () { std::function<void ()> func = [] {}; } или же class C { std::function<void ()> func = [] {}; C () {} }; Я предполагаю, что в каждом исходном файле лямбда-тип может отли…
4 ответа

Почему не отменено одно правило определения для C++17?

Ссылаясь на проект C++ N4713: Каждая программа должна содержать ровно одно определение каждой не встроенной функции или переменной, которая используется в этой программе с помощью odr, за исключением исключенного оператора (9.4.1); Диагностика не тр…
08 фев '19 в 14:17
1 ответ

Могут ли различные шаблоны псевдонимов разрешить возможные нарушения ODR в разных библиотеках?

У меня есть потенциальное нарушение ODR, происходящее в большой базе кода. Это шаблон класса, который переключает поведение на основе #ifdef в разных библиотеках, но конфликтующие библиотеки, вероятно, используют разные экземпляры шаблона. В качеств…
13 фев '19 в 08:37