У меня есть класс шаблона C
, который имеет параметр типа non-type, но ссылочный шаблон для типа P
:
class P {
public:
int x;
int y;
};
template <const P &x>
class C {
public:
const int &f() { return x.x; }
};
Я объявила глобальную переменную типа P
:
P p = {33,44};
Я также объявил функцию, которая возвращает ссылку на P
:
constexpr const P &h() { return p; }
И затем попытался использовать их в следующем:
C<p> o; // line 1
C<h()> oo; // line 2
Конечно, у меня нет проблем с первым экземпляром, кроме второго. Мой компилятор жалуется:
error: non-type template argument does not refer to any declaration
Почему так? Я не смог найти аргумент против него в норме. Я не уверен, что это точно та же проблема, что и в Вызов constexpr в аргументе шаблона по умолчанию, где обсуждался момент создания экземпляра вложенной инициализации. Здесь это скорее проблема типа, но какая? Моя функция h()
возвращает ссылку на хорошо определенную переменную строго определенного типа (const P &
). Я ожидал, что какая-то вставка состоится, дайте правильный результат, но это не так. Не могли бы вы сказать мне, почему?
Объявление функции в виде строки не изменяет ничего на проблему.
Эксперименты проводились с помощью Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn
. Я также пробовал с помощью g++-mp-4.8 (MacPorts gcc48 4.8.3_2) 4.8.3
, и об ошибке сообщалось как:
'h()' is not a valid template argument for type 'const P&' because it is not an object with external linkage
Похоже, что мой вызов h()
(который является constexpr
, поэтому компилируемое время вычисляется) не рассматривается как таковое...
Я забыл сказать, что проблема такая же, если мы попробуем с другой ссылкой:
const P &pp = p;
а затем
C<pp> oo;
на этот раз первый компилятор говорит:
non-type template argument of reference type 'const P &' is not an object
а второй:
error: could not convert template argument 'pp' to 'const P &'
pp
не является объектом? pp
не имеет типа const P&
? Ну, я могу использовать его, как он один... Я знаю, что это ссылка, но неотличимая от родной ссылки, или?