C++ 为什么此代码段与C++;17而编译器在使用C++;11?
为什么这个代码段可以与C++17一起使用,而编译器在使用C++11(即)时会抱怨? 此代码段是否存在任何潜在问题C++ 为什么此代码段与C++;17而编译器在使用C++;11?,c++,c++11,templates,c++17,C++,C++11,Templates,C++17,为什么这个代码段可以与C++17一起使用,而编译器在使用C++11(即)时会抱怨? 此代码段是否存在任何潜在问题 #include<iostream> class ctx { public: int map_create(void*){std::cout << "haha" << std::endl; return 0;}; }; ctx obj; typedef int (ctx::*ctx_mem_func)
#include<iostream>
class ctx
{
public:
int map_create(void*){std::cout << "haha" << std::endl; return 0;};
};
ctx obj;
typedef int (ctx::*ctx_mem_func)(void*);
template <ctx_mem_func func>
int regHelper(void*)
{
((&obj)->*func)(nullptr);
return 0;
}
constexpr ctx_mem_func testFunc = &ctx::map_create;
typedef int(*callBackFunc)(void*);
int reg(callBackFunc)
{
return 0;
}
int main()
{
reg(regHelper<testFunc>);
//But this expression is ok.
reg(regHelper<&ctx::map_create>);
std::cout << "this is a test" << std::endl;
}
#包括
ctx类
{
公众:
int map_create(void*){std::cout这是C++14和C++17之间的区别:
intf();
模板结构S{};
constexpr auto&q=f;
使用R=S;//在C++17中有效,在C++14中无效
更改为,这意味着现在可以将命名函数(成员函数等)的constepr
变量作为NTTP,以前只允许函数的实际名称。“编译器抱怨”…什么编译器?在什么模式下?在哪里?完整引用所有错误!我在c++17()。您使用的编译器是什么?您会遇到什么错误?除非C++17在某些情况下将constexpr
模板参数的要求放宽为纯const
表达式,否则这不会发生。当询问生成错误时,始终在问题中包含完整的错误输出,复制粘贴为文本。此外在代码中获取错误的行上添加注释。并告诉我们如何构建程序、提供的所有选项和标志。请将问题与问题本身中的所有相关信息结合起来。以下是测试:。编译器抱怨。
<source>: In function 'int main()':
<source>:30:28: error: no matches converting function 'regHelper' to type 'callBackFunc {aka int (*)(void*)}'
reg(regHelper<testFunc>);
^
<source>:13:5: note: candidate is: template<int (ctx::* func)(void*)> int regHelper(void*)
int regHelper(void*)
^
int f();
template<int (&)()> struct S {};
constexpr auto& q = f;
using R = S<q>; // valid in C++17, invalid in C++14