170 похожих чатов

@Dpaukaev // type.hpp typename<typename = decltype([]{})> struct S {}; // test.hpp inline void bar(S<>

= {}) {}
inline void foo() {
bar();
}

// test1.cpp
#incldue <test.hpp>

// test2.cpp
#incldue <test.hpp>
А тут не будет нарушения ODR?

14 ответов

8 просмотров

хороший вопрос) у меня локально сейчас нет компилятор 20го, а на годболт не особо удобно всё это смотреть для кучи файлов (

не должно быть http://eel.is/c++draft/basic.def.odr#13.8

да, есть мнение что всё ок, типа когда будут компилировать foo там инстанциируют какую-то очередную версию bar и она будет дёргаться во всех TU

На практике получается, что у нас два разных bar в двух разных TU. А вот определение функции foo, обращающейся к bar одно. Ставлю на то, что взорвётся. Я почти уверен, что весь вопрос можно свести к следующему примеру и я почти уверен, что он взорвётся: // test.hpp static void bar() {} inline void foo() { bar(); } // test1.cpp #incldue <test.hpp> // test2.cpp #incldue <test.hpp>

Vlad
не должно быть http://eel.is/c++draft/basic.def.od...

Я думаю, что для нас имеют значение https://eel.is/c++draft/basic.def.odr#13.10 https://eel.is/c++draft/basic.def.odr#14.sentence-5 Благодаря этому, если я правильно распарсил текст стандарта, у нас в разных TU получаются разные типы у S<>. А соответственно, и у функций, принимающих эти типы. Это значит, что foo в разных TU внутри содержит вызовы разных функций

Слава- Автор вопроса
Ofee Oficsu
На практике получается, что у нас два разных bar в...

И типа эта проблема будет в любой функции, которая лямбдой параметризуется?

Слава- Автор вопроса
Ofee Oficsu
На практике получается, что у нас два разных bar в...

И у нас получается если использовать что-то такое template<typename T, typename = decltype([]{})> struct SType { SType(T t): t_{std::move(t)} {} operator T() { return t_; } T t_; }; using S1 = SType<std::string>; using S2 = SType<std::string>; То функции, которые принимают S1 и S2 тоже условно статическими становятся и можно вылететь в такой же ODR violation?

Слава
И у нас получается если использовать что-то такое ...

Я думаю, что да. Даже если внутри inline функции просто фигурирует S1 или S2, я бы не надеялся на то, что ноги уцелеют

Ofee Oficsu
Я думаю, что для нас имеют значение https://eel.is...

не то чтобы разных на самом деле, скорее двух копий одной и той же функции

Denis P
не то чтобы разных на самом деле, скорее двух копи...

Нет, это именно что две функции (перегрузки?) разных типов, если я верно интерпретирую стандарт, у нас будет void bar(S<unique_type_from_first_tu>) и void bar(S<unique_type_from_second_tu>) и foo вызывает в одном TU одну из них, а во втором другую, что является явным ODR violation

Ofee Oficsu
Нет, это именно что две функции (перегрузки?) разн...

это две одинаковые функции тем не менее, которые отличаются значением типа, там к слову на SO про это написано

Denis P
это две одинаковые функции тем не менее, которые о...

>> две одинаковые функции тем не менее, которые отличаются значением типа Можно подробнее? Я не уверен, что понимаю терминологию И что значит "две одинаковые функции", если в стандарте в note упомянуто, что S<> и S<> can result in the different declarations having distinct types >> там к слову на SO про это написано И всё же, там про другой пример написано К счастью, у нас уже есть @r_mustang, который наступил на обсуждаемые нами грабли – у него взорвалось на границе с dll, нам не обязательно топтаться по граблям вслед за ним

Ofee Oficsu
>> две одинаковые функции тем не менее, которые от...

как я уже сказал выше речь была не про стандарт, а про рассуждения, там функции отличаются фактически типом, который никак не используется, т.е. тело функции от него никак не зависит. С точки зрения стандарта это не ок, но по факту тут это ни на что не влияет, у нас просто получается две одинаковые функции которые отличаются замангленым именем, в итоге компилятор выберет любое определение которое ему понравится. Но это и правда просто рассуждения) так скорее всего будет но гарантии такой никто не даёт естественно, так что так лучше просто не писать

Слава- Автор вопроса
Denis P
как я уже сказал выше речь была не про стандарт, а...

Ну я думал про вариант когда это может прострелить ноги это только когда ты будешь пытаться сохранять адрес bar в разных TU. Например, в одном случае foo может заинлайниться и сохранится bar из текущего TU, в другом нет и т.п.

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

Обсуждают сегодня

я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
короче сгенерила мне эта штука код на ассемблере: struc string val { common local .value dq .value .value: if ~val eq db val end if db 0 } fo...
Vi Chapmann Chapmann
12
Всем привет! Массив вводится с клавиатуры, кол-во элементов неизвестно, поэтому я указал arr db 100 dup(?) С нахождением максимума проблем нет, а вот минимум почему-то всегд...
En Vind Av Sorg
11
кто шарит: mattermost отслеживает что ты на пк запускаешь?
Valentin
13
Помогите, пожалуйста, делаю программу для для подсчёта корней квадратного уравнения, знаю, что есть куча недочётов, недоработок, но основная проблема в том, что почему-то при ...
NYC
13
#include <stdio.h> int main(void) { int n; scanf("%d", &n); int digits1[n] = {0}; int digits2[n] = {0}; я не могу таким образом заранее массив нулями заполнить?
Linus
12
в сях есть множество как в питоне? для удаление дубликатов
Linus
25
читать файл максимально быстро? странный вопрос))
zamtmn
53
я про форму записи. смысл указывать что 8 байтный регистр 8 байт?
Aiwan \ (•◡•) / _bot
10
Вроде бы вопрос уже заезжанный, но тем не менее У меня есть функция menu() которая выводит набор возможных действий, а затем спрашивает у пользователя что он хотел бы сделать....
David Golovatin
5
Карта сайта