C++ 为什么此代码段与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)

为什么这个代码段可以与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)(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