C++ std::使用sizeof compile hack启用_if
不确定下面代码中的C++ std::使用sizeof compile hack启用_if,c++,c++17,C++,C++17,不确定下面代码中的sizeof(Input)如何使其编译。我认为那里也有一些逗号运算符的魔力,但不确定。我知道SFINAE需要在即时上下文中发生,这就是我对typename F=T所做的,但我不确定为什么(A)在(B)失败时起作用 #include <iostream> #include <type_traits> using namespace std; template <typename T> struct Test { templ
sizeof(Input)
如何使其编译。我认为那里也有一些逗号运算符的魔力,但不确定。我知道SFINAE
需要在即时上下文中发生,这就是我对typename F=T
所做的,但我不确定为什么(A)
在(B)
失败时起作用
#include <iostream>
#include <type_traits>
using namespace std;
template <typename T>
struct Test {
template <typename Input,typename F = T, enable_if_t<std::is_same_v<F,int>, bool>* = nullptr>
// template <typename Input, enable_if_t<(sizeof(Input),std::is_same_v<T,int>), bool>* = nullptr> // Works, but how? (A)
// template <typename Input, enable_if_t<std::is_same_v<T,int>, bool>* = nullptr> (B)
void func(Input a) {
cout << "INT" << endl;
}
template <typename Input,typename F = T, enable_if_t<!std::is_same_v<F,int>, bool>* = nullptr>
// template <typename Input, enable_if_t<(sizeof(Input),!std::is_same_v<T,int>), bool>* = nullptr> // Works, but how? (A)
// template <typename Input, enable_if_t<!std::is_same_v<T,int>, bool>* = nullptr> // Doesnt work (B)
void func(Input a) {
cout << "NON INT" << endl;
}
};
int main(){
Test<int> t;
t.func(5);
}
#包括
#包括
使用名称空间std;
模板
结构测试{
模板
//模板//工作,但如何工作?(A)
//模板(B)
无效函数(输入a){
cout),bool>*=nullptr>//工作,但如何工作?(A)
//模板*=nullptr>//不起作用(B)
无效函数(输入a){
事实上,
(A) 也是格式不正确的NDR,但编译器无法成功诊断
一旦T
在类中被固定,就没有输入
,这使得模板有效
它似乎可以工作。随着表达式变得依赖于模板,第一阶段的检查更加复杂,只有第二阶段(在替换过程中)失败但不是错误(SFINAE适用)。完整表达式(sizeof(Input),std::is_same_v)
确实取决于即时上下文,而运算符,
强制表达式的求值顺序从左到右。因此,它认为这似乎是合理的,即使仍然有点令人惊讶。我尝试了这个代码段,实际上A和B都起作用,您可以发布为您显示的错误消息吗?@PYA-Templates-are多次评估。在安装前评估一次,安装后再评估一次。安装前可以评估的所有东西都将是。不能评估的东西将在安装后评估。因为Input
是直接上下文的一部分,所以在安装前不能评估。所以当我们只有std::is_-same_v
与(B)中的一样,编译器可以清楚地看到这可以在安装之前进行计算。当您改为使用表达式(sizeof(Input),std::is_-same_v)
,如果编译器开始尝试计算它,它将看到输入,它不知道它是什么。因此,计算必须在安装之后进行。理论上,它可以计算出(sizeof(Input),std::is_same_v)
总是错误的,但它显然不是那么简单。在这种情况下,它不是。它也不必如此,因为语言禁止这种构造NDR。谢谢。我不知道如何理解sizeof在这里做了什么使它工作?你能解释一下吗?sizeof(输入)
取决于输入
,因此像sizeof(Input)==4这样的条件必须等待给定输入的实例化
sizeof(Input),false总是false
(但从编译器的角度来看(一般情况下)不是那么容易演示),但取决于输入
。因此编译器等待SFINAE可能应用的实例化。谢谢!有效且未注释的代码是否格式正确?A和B都会使程序的NDR格式错误