Я пытался подтвердить пример на стр. 91 книги «Эффективный современный C ++» и натолкнулся на странную проблему. Этот код
template<typename C>
void doStuff(C& a, C& b) noexcept(noexcept(doStuff(a.front(), b.front()))) {
std::cout << "container version" << std::endl;
}
template<>
void doStuff<int>(int& x, int& y) noexcept {
std::cout << "int version" << std::endl;
}
int main() {
vector<int> v1 = {1, 2, 3};
vector<int> v2 = {4, 5, 6};
int x = 5;
int y = 6;
doStuff(x, y);
doStuff(v1, v2);
}
Выдает ошибку вроде
ошибка: запрос члена 'front' в 'a', который имеет неклассовый тип 'int' void doStuff (C & a, C & b) noexcept (noexcept (doStuff (a.front (), b.front ()) )) {
Итак, похоже, что вызывается верхняя версия doStuff, хотя a.front () и b.front () должны возвращать ссылки на ints. Если я удалю из кода все объявления noexcept, я получу ожидаемый результат.
Это с gcc 5.4.
Что я делаю неправильно?
Спасибо
doStuff
, компилятор ничего не знает о специализации дляint
. - person Some programmer dude   schedule 18.08.2016doStuff
не был объявлен при первом использовании в спецификацииnoexcept
. - person aschepler   schedule 18.08.2016