gpt4 book ai didi

c++ - 为什么此代码片段适用于 C++17 而编译器在使用 C++11 时会报错?

转载 作者:行者123 更新时间:2023-12-04 02:29:31 25 4
gpt4 key购买 nike

为什么此代码片段适用于 C++17 而编译器在使用 C++11 时会报错(即 https://godbolt.org/z/71G91P )?此代码段是否存在任何潜在问题?

#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;
}

以下是使用c++11(gun 10.0.2)时的错误信息:

<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*)
^

最佳答案

这是C++14和C++17的区别。 Simplified :

int f();
template<int (&)()> struct S {};
constexpr auto& q = f;
using R = S<q>; // valid in C++17, invalid in C++14

更改为Allow constant evaluation for all non-type template arguments ,这意味着现在可以将命名函数(成员函数等)的 constexpr 变量作为 NTTP,而以前只允许使用函数的实际名称。

关于c++ - 为什么此代码片段适用于 C++17 而编译器在使用 C++11 时会报错?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65234338/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com