Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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++模板函数未使用类型名 我试图让我了解C++模板和复制语义。 我理解为什么我不能调用assign1,因为它要求右值引用,而我提供的是左值引用 但是为什么我能够调用assign2,它施加了相同的约束 样板 无效分配1 args&&。。。参数{} 样板 void assign2Args&&。。。参数{} 样板 void assign3Args&&。。。参数{} int main{ 常数int r=2; assign1r;//没有匹配的函数用于调用。。。 assign2r;//好的! assign3r;//没有匹配的函数用于调用。。。 }_C++_Templates_Forwarding Reference - Fatal编程技术网

C++模板函数未使用类型名 我试图让我了解C++模板和复制语义。 我理解为什么我不能调用assign1,因为它要求右值引用,而我提供的是左值引用 但是为什么我能够调用assign2,它施加了相同的约束 样板 无效分配1 args&&。。。参数{} 样板 void assign2Args&&。。。参数{} 样板 void assign3Args&&。。。参数{} int main{ 常数int r=2; assign1r;//没有匹配的函数用于调用。。。 assign2r;//好的! assign3r;//没有匹配的函数用于调用。。。 }

C++模板函数未使用类型名 我试图让我了解C++模板和复制语义。 我理解为什么我不能调用assign1,因为它要求右值引用,而我提供的是左值引用 但是为什么我能够调用assign2,它施加了相同的约束 样板 无效分配1 args&&。。。参数{} 样板 void assign2Args&&。。。参数{} 样板 void assign3Args&&。。。参数{} int main{ 常数int r=2; assign1r;//没有匹配的函数用于调用。。。 assign2r;//好的! assign3r;//没有匹配的函数用于调用。。。 },c++,templates,forwarding-reference,C++,Templates,Forwarding Reference,给定1r;,如果显式指定模板参数,那么assign1的参数类型将是int&&,正如您所说,它是右值引用,不能与左值绑定 给定赋值2r;,如果将第一个模板参数A指定为int,则参数pack Args将从函数参数r推导而来。请注意,它不是右值引用,而是可以同时接受左值和右值的引用。根据函数参数是左值还是右值,根据类型推断结果,函数参数类型将是左值引用或右值引用 给定3r;,您只指定了第一个模板参数A,但第二个参数B无法从函数参数推导出来,因此调用失败 如果要使函数模板仅接受右值,可以添加静态断言,如

给定1r;,如果显式指定模板参数,那么assign1的参数类型将是int&&,正如您所说,它是右值引用,不能与左值绑定

给定赋值2r;,如果将第一个模板参数A指定为int,则参数pack Args将从函数参数r推导而来。请注意,它不是右值引用,而是可以同时接受左值和右值的引用。根据函数参数是左值还是右值,根据类型推断结果,函数参数类型将是左值引用或右值引用

给定3r;,您只指定了第一个模板参数A,但第二个参数B无法从函数参数推导出来,因此调用失败

如果要使函数模板仅接受右值,可以添加静态断言,如

给定1r;,如果显式指定模板参数,那么assign1的参数类型将是int&&,正如您所说,它是右值引用,不能与左值绑定

给定赋值2r;,如果将第一个模板参数A指定为int,则参数pack Args将从函数参数r推导而来。请注意,它不是右值引用,而是可以同时接受左值和右值的引用。根据函数参数是左值还是右值,根据类型推断结果,函数参数类型将是左值引用或右值引用

给定3r;,您只指定了第一个模板参数A,但第二个参数B无法从函数参数推导出来,因此调用失败

如果要使函数模板仅接受右值,可以添加静态断言,如


对于assign1,您可以显式指定参数类型,而实际参数不能转换为该类型。对于assign2,您可以显式指定A,但A不用于任何用途。相反,Args是从参数类型自动推导出来的。对于assign1,您显式指定参数类型,而实际参数无法转换为该类型。对于assign2,您可以显式指定A,但A不用于任何用途。相反,Args是从参数类型自动推导出来的。我不明白这一点,注意它不是右值引用,而是转发引用。对不起,我是C++新手,我想函数的值是R值ref@FRR当您按照代码中显示的语法声明它时,它将成为转发引用;有关更多信息,请参阅。谢谢!这是一种特殊情况。我觉得有点奇怪。如果我想强制我的模板函数仅接受r值引用,该怎么办?@FRR您可以添加static_assert或SFINAE以将类型约束为右值引用,或者添加一个使用左值引用的重载并将其标记为delete。e、 g.模板无效分配2参数和。。。arguments=delete;。谢谢C++肯定是奇怪的,我从这个和得到的东西在函数/类模板中使用时有点不同。随着我对这门语言越来越熟悉,我会记住这一点。谢谢你的帮助!我不明白这一点,它不是右值引用,而是转发引用。对不起,我是C++新手,我想函数的值是R值ref@FRR当您按照代码中显示的语法声明它时,它将成为转发引用;有关更多信息,请参阅。谢谢!这是一种特殊情况。我觉得有点奇怪。如果我想强制我的模板函数仅接受r值引用,该怎么办?@FRR您可以添加static_assert或SFINAE以将类型约束为右值引用,或者添加一个使用左值引用的重载并将其标记为delete。e、 g.模板无效分配2参数和。。。arguments=delete;。谢谢C++肯定是奇怪的,我从这个和得到的东西在函数/类模板中使用时有点不同。随着我对这门语言越来越熟悉,我会记住这一点。谢谢你的帮助!
template<typename A, typename... Args>
void assign2(Args&& ...) { 
    static_assert(((!std::is_lvalue_reference_v<Args>) && ...), "must be rvalue");
}
template<typename A, typename... Args>
std::enable_if_t<((!std::is_lvalue_reference_v<Args>) && ...)> assign2(Args&& ...) {
}
template<typename A, typename... Args> 
void assign2(Args& ... arguments) = delete;