Constantine
Нарушает ли лямбда, объявленная в inline шаблонной функции и замыкающая ее параметры, правило ODR?
Constantine
template <typename T> inline std::function<void()> f(T* object) { return [object](){}; }
Aidar
да как лямбда может нарушать ODR?
Aidar
у каждой отдельно взятой лямбды свой тип
Berkus
Constantine
A type defined within the body of an extern inline function is the same type in every translation unit.
Berkus
Aidar
ну значит он один
Aidar
(у тебя там шаблон, если ты об этом, для каждого инстанса шаблона будет свой тип лямбды)
Mikhail
Constantine
Anatoly
конечно, да
Anatoly
хотя, не понятно откуда вопрос. [](){} - это лямбда выражение, как если бы ты написал 1+1
Anatoly
что здесь definition?
Constantine
это лямбда-выражение является объектом некоторого типа
Anatoly
и?
Anatoly
1+1 тоже выражение некоторого типа
Constantine
An inline function shall be defined in every translation unit in which it is odr-used and shall have exactly the same definition in every case
Aidar
и?
ну тут на самом деле есть дефинишн
Aidar
у тебя блин шаблон
Anatoly
Aidar
втопку инлайн
Constantine
почему бы компилятору не генерировать лямбду независимо от шаблонных параметров содержащих её функцию?
Aidar
Anatoly
по определению инстанцирования шаблона
Aidar
это не функция
Aidar
это шаблон функции
Constantine
хорошо, при инстанцировании шаблона почему бы компилятору не сгенерировать имя типа для лямбды как lambda_generatedN
Constantine
после чего не заявить, что в разных модулях компиляции это имя генерируется по-разному
Constantine
поэтому реализация функции нарушает правило ODR
Anatoly
потому что тело инстанцированного шаблона фукнции гарантирует уникальность определенных в нем типов, если бы они были
Constantine
уникальности недостаточно
Anatoly
все что справедливо для класса/функции, будет справедливо и для инстанцированных шаблонов класса/функции
Constantine
нужно еще единообразие между модулями компиляции
Berkus
Berkus
модули компиляции вообще могут каждый со своими флагами собираться
Constantine
потому что в противном случае заданная шаблонная функция ill-formed, поскольку в разных модулях компиляции будет сгенерирована разная ее реализация
Berkus
это будут разные шаблонные функции
Anatoly
Anatoly
но нет, они везде одни и теже
Anatoly
поэтому ODR не нарушается
Constantine
и я тут перепроверил, компилятор MSC 14 уверен, что этот код нарушает ODR
Berkus
Berkus
Anatoly
Anonymous
да как майкрософт сделали так и MVS
Anonymous
как винду сделали, точнее
Anonymous
выходит винда, на следующий день кряки, так и с mvs дела обстояли
Anatoly
ну я не стал бы так только на ms валить, во всех компиляторах есть ошибки
Anonymous
баг на баге
Anonymous
gcc идеальный
Berkus
Anonymous
он лучше всех оптимизирует
Berkus
ой не надо
Berkus
icc лучше оптимизирует
Anonymous
MinGW курит в сторонке
Anonymous
если мы говорим о с/с++
Крылатый
Berkus
MinGW это виндовый клон гцц, ты что с чем сравниваешь-то?
Anonymous
С/С++ компиляторы
Berkus
лучше перестань прямо сейчас
Berkus
гцц сравнил с гцц
Berkus
молодец
Berkus
выиграл гцц
Крылатый
Aidar
Мингв кривой порт
Anonymous
есть разница
Anonymous
большая таки разница
Anonymous
я бы не сказал что они идентичны
Berkus
никакой, мингв это гцц плюс обвес со всяким говном чтобы собирать под виндой
Anonymous
я об этом и говорю
Berkus
мне уже и так очень смешно, прекращай
Anonymous
он очень много мусора бросает в екзешник
Constantine
я не верю в непогрешимость MSC, но я видел за свою жизнь намного меньше багов MSC, чем GCC :)
Anonymous
я тебе привожу факты, нуб