为什么此代码段适用于C ++ 17,而编译器在使用C ++ 11时却抱怨呢?

约翰

为什么此代码段适用于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之间的区别。简化

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

更改是允许对所有非类型模板参数进行常量求值,这意味着现在允许constexpr命名函数(成员函数等)变量作为NTTP,而以前只允许使用函数的实际名称。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++:使用Visual Studio编译器时的const指针

来自分类Dev

安装GCC时使用C编译器!

来自分类Dev

编译器选项不适用于无序设置的C ++ 11功能

来自分类Dev

C ++ 11的不同编译器行为

来自分类Dev

程序适用于 onlineGDB 编译器,但使用 MinGW 编译时出现逻辑错误

来自分类Dev

编译器不会使用 -std=c++11 编译智能指针

来自分类Dev

使用 CLion、CMake 和 VS2017 编译器编译 C++17

来自分类Dev

编译XS模块时,如何使perl Makefile.PL使用给定的C编译器?

来自分类Dev

编译器抱怨“未声明opcode_table(此函数首次使用)”,为什么?

来自分类Dev

为什么该程序可以在C ++ 14中编译良好,但不能在C ++ 11编译器中编译呢?

来自分类Dev

为什么此Java代码有效?编译器不抱怨关闭

来自分类Dev

使用distutils构建C Extension时打印打印编译器和链接器命令

来自分类Dev

安装C编译器时,在$ PATH中找不到可接受的C编译器

来自分类Dev

C++ 为什么在不使用被删除的函数时编译器失败,错误代码为 C2280

来自分类Dev

从C ++ 11标准使用constexpr错误,还是我抓到一些编译器错误?

来自分类Dev

如何更新我的编译器以使用C ++ 11功能?

来自分类Dev

使用MinGW或VS2012编译器在Qt上启用C ++ 11支持

来自分类Dev

从C ++ 11标准使用constexpr错误,还是我抓到一些编译器错误?

来自分类Dev

为什么我的编译器在 C++ 中使用动态分配的内存时给我错误

来自分类Dev

使用Visual Studio 2017的编译器在C ++ 17中使用Lambda编译Kevlin Henney的Fizzbuzz

来自分类Dev

在C ++中使用Lambda时出现奇怪的编译器消息

来自分类Dev

在Linux中使用默认的gcc编译器时是否需要在C中释放指针?

来自分类Dev

在Visual C ++ 2010编译器的code :: block中使用小部件库时,发生错误

来自分类Dev

在编写if-else编译器时抱怨但不速记时,为什么?

来自分类Dev

Intel C编译器不适用于sudo

来自分类Dev

C#编译器能否在编译时插入每次使用时自动递增的常量值?

来自分类Dev

使用C30编译器在MPLABX中编译项目时出现Segmentaion Fault(核心转储)错误

来自分类Dev

C ++ 11编译器的构造函数继承生成错误

来自分类Dev

Ideone使用的C ++编译器

Related 相关文章

  1. 1

    C ++:使用Visual Studio编译器时的const指针

  2. 2

    安装GCC时使用C编译器!

  3. 3

    编译器选项不适用于无序设置的C ++ 11功能

  4. 4

    C ++ 11的不同编译器行为

  5. 5

    程序适用于 onlineGDB 编译器,但使用 MinGW 编译时出现逻辑错误

  6. 6

    编译器不会使用 -std=c++11 编译智能指针

  7. 7

    使用 CLion、CMake 和 VS2017 编译器编译 C++17

  8. 8

    编译XS模块时,如何使perl Makefile.PL使用给定的C编译器?

  9. 9

    编译器抱怨“未声明opcode_table(此函数首次使用)”,为什么?

  10. 10

    为什么该程序可以在C ++ 14中编译良好,但不能在C ++ 11编译器中编译呢?

  11. 11

    为什么此Java代码有效?编译器不抱怨关闭

  12. 12

    使用distutils构建C Extension时打印打印编译器和链接器命令

  13. 13

    安装C编译器时,在$ PATH中找不到可接受的C编译器

  14. 14

    C++ 为什么在不使用被删除的函数时编译器失败,错误代码为 C2280

  15. 15

    从C ++ 11标准使用constexpr错误,还是我抓到一些编译器错误?

  16. 16

    如何更新我的编译器以使用C ++ 11功能?

  17. 17

    使用MinGW或VS2012编译器在Qt上启用C ++ 11支持

  18. 18

    从C ++ 11标准使用constexpr错误,还是我抓到一些编译器错误?

  19. 19

    为什么我的编译器在 C++ 中使用动态分配的内存时给我错误

  20. 20

    使用Visual Studio 2017的编译器在C ++ 17中使用Lambda编译Kevlin Henney的Fizzbuzz

  21. 21

    在C ++中使用Lambda时出现奇怪的编译器消息

  22. 22

    在Linux中使用默认的gcc编译器时是否需要在C中释放指针?

  23. 23

    在Visual C ++ 2010编译器的code :: block中使用小部件库时,发生错误

  24. 24

    在编写if-else编译器时抱怨但不速记时,为什么?

  25. 25

    Intel C编译器不适用于sudo

  26. 26

    C#编译器能否在编译时插入每次使用时自动递增的常量值?

  27. 27

    使用C30编译器在MPLABX中编译项目时出现Segmentaion Fault(核心转储)错误

  28. 28

    C ++ 11编译器的构造函数继承生成错误

  29. 29

    Ideone使用的C ++编译器

热门标签

归档