Я был мастером, чтобы подтвердить пример на стр. 91 Эффективного современного C++, и я столкнулся с тем, что кажется странной проблемой. Этот кодC++ noexcept декларация изменения вычета шаблона
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);
}
дает мне ошибку, как
error: request for member ‘front’ in ‘a’, which is of non-class type ‘int’ void doStuff(C& a, C& b) noexcept(noexcept(doStuff(a.front(), b.front()))) {
Таким образом, кажется, как верхняя версия DoStuff вызывается, даже если a.front() и b.front() должна быть возвращая ссылки на ints. Если я удалю все noexcept объявления из кода, я получаю ожидаемый результат.
Это с gcc 5.4.
Что я делаю неправильно?
Благодаря
Помните, что шаблоны являются функция compile.time. Когда определена первая версия функции 'doStuff', компилятор ничего не знает о специализации для' int'. –
Существует также проблема, что 'doStuff' не был объявлен, когда он впервые используется в спецификации noexcept. – aschepler