> Конечно нет! И потому не согласен с тем, что NULL можно заменять в коде 0.
Но NULL проблемы не решает, а словить пару часов интереснейшей отладки overload resolution можно элементарно. Если же там был бы написан ноль, было бы всё понятно.
А как же тогда работает код у ваших студентов? Дело в том, что integral constant expression, равный нулю, является null pointer constant и может быть преобразован к T*.
Дело в том, что NULL в C++ должен быть определён как
#define NULL 0
Определять NULL как (void *)0 нельзя. Поэтому следующий код является корректным:
f(int x);
void g() {
f(NULL);
}
Я согласен что это неинтуитивно. Что именно использовать в C++03 — NULL или 0 — определяется стилем кодирования в каждом проекте, так как саму проблему с null pointer constant в C++03 не решает.
Да. Что вы дальше хотели сказать я так и не понял. (Обычный R+A компилировался без LTO, если вы это имели ввиду.)
> Мне вообще кажется, что основные проблемы были вызваны тем, что перестало срабатывать встраивание в каких-нибудь контейнерах. Или вроде того случая, который вы привели по ссылке в начале обсуждения.
Основные — да. Но не все. Кроме того, мы же обсуждаем «правило» что инлайн функции в классах определять «НЕЛЬЗЯ». Поэтому считаю тест корректным.
Epic. Так не бывает.
Однако в GCC и Clang:
И дальше компилятор разбирается по правилам, которых нет в языке.
Но NULL проблемы не решает, а словить пару часов интереснейшей отладки overload resolution можно элементарно. Если же там был бы написан ноль, было бы всё понятно.
И вообще, это сегодня неактуально. nullptr.
Overload resolution выбирает f(int) для NULL (если #define NULL 0), точно также как и для 0.
Нет такого неявного приведения типов в C++: T* не приводится неявно к int.
Не согласен со словом «существенно». Зависит от приложения.
> Фактически, я бы сказал, что по умолчанию вы делаете все функции классов невстраиваемыми, если нет явной причины сделать их встраиваемыми.
А вот с этим я согласен.
Определять NULL как (void *)0 нельзя. Поэтому следующий код является корректным:
Я согласен что это неинтуитивно. Что именно использовать в C++03 — NULL или 0 — определяется стилем кодирования в каждом проекте, так как саму проблему с null pointer constant в C++03 не решает.
Да. Что вы дальше хотели сказать я так и не понял. (Обычный R+A компилировался без LTO, если вы это имели ввиду.)
> Мне вообще кажется, что основные проблемы были вызваны тем, что перестало срабатывать встраивание в каких-нибудь контейнерах. Или вроде того случая, который вы привели по ссылке в начале обсуждения.
Основные — да. Но не все. Кроме того, мы же обсуждаем «правило» что инлайн функции в классах определять «НЕЛЬЗЯ». Поэтому считаю тест корректным.
КО: заголовочный файл становится частью многих единиц трансляции.
> С другой стороны, ваш тест не показывает, сколько процентов кода тормозит.
Без инлайнинга код начинает тормозить везде равномерно.