Описание тега one-definition-rule
Все, что связано с C++ One Definition Rule (ODR), то есть правилом стандарта C++, запрещающим множественные определения большинства языковых объектов. ODR примерно требует, чтобы большинство языковых сущностей (объекты, функции, шаблоны и т. Д.) Имели уникальное (не дублированное) определение в одной и той же единице перевода или во всей программе, в то время как несколько объявлений все еще возможны.
1
ответ
Входят ли аргументы шаблона по умолчанию в правило с одним определением?
Могут ли несколько единиц перевода иметь объявления одного и того же шаблона с разными аргументами шаблона по умолчанию, но с одинаковым определением? Например, нарушает ли следующий код ODR, если единицы перевода в b.cpp а также c.cpp связаны вмест…
01 ноя '13 в 15:14
1
ответ
Чистая реализация виртуальной функции
Я читаю " Эффективный C++" Скотта Мейерса, и я нахожусь в разделе о наследовании. Он сказал, что Чистые виртуальные функции определяют только наследование интерфейса. Простые (нечистые) виртуальные функции определяют наследование интерфейса плюс нас…
03 дек '15 в 04:04
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>…
22 фев '12 в 06:15
1
ответ
Ортогональная регрессия расстояния в 3d
Кто-нибудь знает, как найти лучшую подходящую линию для точечного рисунка в 3d?Меня интересует так называемая линия ODR (регрессия ортогонального расстояния), которая минимизирует сумму евклидовых расстояний всех точек линии. Есть ли функция r для э…
15 авг '11 в 08:34
2
ответа
Использование `__DATE__` или`__TIME__` нарушает правило одного определения?
Когда используешь __DATE__ или же __TIME__ в заголовочном файле результаты препроцессора для включения этого заголовка могут несколько отличаться. При каких обстоятельствах использование __DATE__ или же __TIME__ в заголовочном файле нарушать правило…
21 дек '16 в 08:18
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; } …
18 июн '16 в 21:13
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…
07 сен '17 в 14:56
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, если вам интересно) У меня есть библиотека, которая использует вышеупомянутую ста…
18 фев '14 в 20:06
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…
25 сен '15 в 17:31
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 <<…
27 фев '15 в 13:17
2
ответа
Может ли использование лямбды в заголовочных файлах нарушать ODR?
Можно ли в заголовочном файле записать следующее: inline void f () { std::function<void ()> func = [] {}; } или же class C { std::function<void ()> func = [] {}; C () {} }; Я предполагаю, что в каждом исходном файле лямбда-тип может отли…
11 янв '16 в 09:19
4
ответа
Почему не отменено одно правило определения для C++17?
Ссылаясь на проект C++ N4713: Каждая программа должна содержать ровно одно определение каждой не встроенной функции или переменной, которая используется в этой программе с помощью odr, за исключением исключенного оператора (9.4.1); Диагностика не тр…
08 фев '19 в 14:17
1
ответ
Могут ли различные шаблоны псевдонимов разрешить возможные нарушения ODR в разных библиотеках?
У меня есть потенциальное нарушение ODR, происходящее в большой базе кода. Это шаблон класса, который переключает поведение на основе #ifdef в разных библиотеках, но конфликтующие библиотеки, вероятно, используют разные экземпляры шаблона. В качеств…
13 фев '19 в 08:37