【发布时间】:2016-12-25 18:26:43
【问题描述】:
我正在努力确认 Effective Modern C++ 第 91 页上的示例,但遇到了一个似乎很奇怪的问题。这段代码
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: 在‘a’中请求成员‘front’,它是非类类型的 ‘int’ void doStuff(C& a, C& b) noexcept(noexcept(doStuff(a.front(), b.front()))) {
因此,似乎调用了 doStuff 的顶级版本,即使 a.front() 和 b.front() 应该返回对 int 的引用。如果我从代码中删除所有 noexcept 声明,我会得到预期的输出。
这是 gcc 5.4 的版本。
我做错了什么?
谢谢
【问题讨论】:
-
请记住,模板是 compile.time 功能。在定义
doStuff函数的第一个版本时,编译器对int的特化一无所知。 -
还有
doStuff在noexcept规范中首次使用时没有声明的问题。