Потенциальная оценка тел встроенных функций и создание экземпляров элементов шаблона

Когда выражения, содержащиеся внутри функции, помеченной как встроенная, считаются «потенциально оцененными»?

a.cpp

template <typename T>
const T& foo(const T& arg) { return arg; }

inline void dead() {
int x(21);
x = foo(x);
}

b.cpp

#include <iostream>

template <typename T> const T& foo(const T&);

int main(int argc, char *argv[]) {
std::cout << foo(12) << std::endl;
}

Если выражения считаются «потенциально вычисляемыми», как только определена встроенная функция, то шаблон должен быть создан, и я ожидаю $(CCC) -c a.cpp; $(CCC) -c b.cpp; $(CCC) a.o b.o -o bin успешно связать Если вместо этого выражения внутри функции, объявленной inline, становятся «потенциально вычисляемыми» только тогда, когда такая функция сама используется в odr, тогда я ожидаю $(CCC) -c a.cpp; $(CCC) -c b.cpp; $(CCC) a.o b.o -o bin потерпеть неудачу во время шага ссылки.

До сих пор я тестировал xl C ++ 12 (который успешно связывается) и различные версии gcc + clang 3.5 (все из которых не в состоянии связать).

Какое поведение правильно? Я пропускаю третий вариант здесь?

4

Решение

§14 [temp] / p6:

Шаблон функции, функция-член шаблона класса, переменная
шаблон или статический член данных шаблона класса должны быть определены
в каждой единице перевода, в которой он неявно создается
(14.7.1), если соответствующая специализация не является явно
создание экземпляра (14.7.2) в некоторой единице перевода; нет диагностики
требуется.

Ваш код неверен без диагностики. Оба компилятора ведут себя правильно.

7

Другие решения


По вопросам рекламы [email protected]