Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::使用sizeof compile hack启用_if_C++_C++17 - Fatal编程技术网

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格式错误