Почему это ознаменовало дубликат? Where and why do I have to put the “template” and “typename” keywords?
не отвечает на этот вопрос. Описанное здесь поведение нигде не упоминается (вы не найдете ни одного замечания о ожидаемом поведении auto
).
Это не дубликат, тем более, что в разных компиляторах существует противоречивое поведение.
UPDATE
Многое, как GCC, лязг также не компилировать:
17 : error: expected expression
return p->is<true>();
^
Однако на MSVC код с auto
обнаружения успешно компиляции.
Очевидно, что есть ошибка компилятора где-то.
Рассмотрим следующий класс:
struct A {
template<bool>
bool is() const {
return true;
}
template<bool>
static A* get() {
static A a;
return &a;
}
};
Если шаблонной функции, такие как
template<bool cond>
bool foo() {
auto p = A::get<cond>();
return p->is<true>();
}
пытается вызвать A::is<bool>
, она с треском проваливается:
main.cpp: In function 'bool foo()':
main.cpp:17:24: error: expected primary-expression before ')' token
return p->is<true>();
^
main.cpp: In instantiation of 'bool foo() [with bool cond = true]':
main.cpp:21:22: required from here
main.cpp:17:17: error: invalid operands of types '<unresolved overloaded function type>' and 'bool' to binary 'operator<'
return p->is<true>();
^
однако, если только заменить auto
с явным типом (A*
):
template<bool cond>
bool foo() {
A* p = A::get<cond>();
return p->is<true>();
}
он работает.
В чем причина этого?
... и вы не должны утверждать, что обнаружили ошибку компилятора, если у вас нет действительно веских оснований говорить об этом. – Petr
@Petr Почему? Ошибки компилятора действительно не так уж необычны. Я встречал их бесчисленное множество. Это подозрительное поведение, которое несовместимо для разных компиляторов, поэтому я не понимаю, почему я должен иметь действительно хорошую причину, просто чтобы узнать, может ли это быть ошибкой компилятора. –
И я думаю, вы знаете, что гораздо более распространенными являются люди, утверждающие, что они обнаружили ошибку компилятора, в то время как на самом деле они просто не понимали стандарт должным образом. Более того, это просто признак вежливости, чтобы не сказать, что кто-то другой ошибается, если вы абсолютно не уверены. См. [Этот раздел] (http://www.catb.org/esr/faqs/smart-questions.html#idp59344752) «Как задавать вопросы умным путем» Э.С. Раймонд. – Petr