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 ответов

36 просмотров

хороший вопрос) у меня локально сейчас нет компилятор 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, в другом нет и т.п.

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта