c++ noexcept声明改变了模板演绎
C++ noexcept declaration changes template deduction
我正在修补确认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);
}
给我一个类似
的错误错误:请求成员' front '在' a ',它是非类类型' int ' void doStuff(C&一个,C&b) noexcept (noexcept (doStuff (a.front (),b.front ()))) {
所以,看起来doStuff的顶级版本正在被调用,即使a.front()和b.front()应该返回对int型的引用。如果我从代码中删除所有的noexcept声明,我将得到预期的输出。
我做错了什么?
谢谢
问题是,当名称查找在此时:
template<typename C>
void doStuff(C& a, C& b) noexcept(noexcept(doStuff(a.front(), b.front()))) {
// ^^^^^^^
将只找到一个doStuff()
:您的函数模板。还没有声明专门化,因此不考虑它。
首先要做的是简单地避免专门化。他们尴尬。但是,真正的解决方法是添加一个额外的空类型,仅用于依赖参数的查找目的。这将为noexcept
查找添加一个依赖名称,将调用延迟到实例化:
namespace N {
struct adl { };
void doStuff(adl, int& , int& ) noexcept {
std::cout << "int version" << std::endl;
}
template<typename C>
void doStuff(adl, C& a, C& b) noexcept(noexcept(doStuff(adl{}, a.front(), b.front()))) {
std::cout << "container version" << std::endl;
}
}
template <class C>
void doStuff(C& a, C& b) noexcept(noexcept(doStuff(N::adl{}, a, b)))
{
doStuff(N::adl{}, a, b);
}
模板特化不是重载。你对doStuff<int>
的专门化不是doStuff<C>
的超载,它是专门化。所以重载解析不会考虑它,模板实例化会考虑它,如果重载解析选择了原始对象。用重载(非模板,取两个int&
)替换专门化
void doStuff(int& a, int& b) noexcept;
相关文章:
- 变量没有改变?通过向量的函数调用
- 如何改变c++应用程序的视觉效果
- C++在不同线程中改变向量
- 如何访问和改变存储在矢量C++中的对象
- 在C++行尾写一个分号或多个分号是否会改变任何内容
- 为什么字符串的 move() 会改变内存中底层数据的位置?
- 为什么 c++ 动态数组的大小没有改变?
- 为什么提升图库的 read_graphviz() 函数会改变节点的索引
- 在向量内更改变量的值不会改变其在向量外的值
- 为什么 GCC 不能假设 std::vector::size 在这个循环中不会改变?
- 改变或缩放两个正态分布以具有特定的相关系数
- 当我使用CHAR_INFO结构时,控制台会无缘无故地改变颜色
- 为什么我的函数接受"std::string"进行排序不会改变它?
- MFC:你能在CDateTimeCtrl中改变自旋的加速度吗?
- 为什么切换 for 循环的顺序会显著改变执行时间?
- 使用可变参数模板改变模板参数
- 模板模板参数的演绎指南
- C++中物体改变识别的设计模式?
- 通过从构造函数中的'this'复制的指针改变常量对象
- c++ noexcept声明改变了模板演绎