关于C++17中constexpr静态数据成员命名空间声明弃用的疑问
关于C++17中constexpr静态成员命名空间声明弃用的疑问
我是非英语母语者,用翻译工具没解决问题,现参考cppreference内容咨询:
cppreference标注了以下内容为(deprecated)(since C++17):在类内使用constexpr说明符定义的静态数据成员的命名空间作用域声明,示例代码:
struct S { static constexpr int x = 42; // implicitly inline, defines S::x }; constexpr int S::x; // declares S::x, not a redefinition
我知道deprecated表示不再需要,但不清楚自C17起哪部分内容被弃用。我用GCC 16.1编译器,指定C17标准,添加了大量警告选项(如-Wall、-Wextra等)编译代码,仍正常运行无任何警告提示。我的Sublime Text构建配置如下:
{ "shell_cmd": "g++ -std=c++17 -Wall -Wextra -Wpedantic -Wshadow -Wnon-virtual-dtor -Wold-style-cast -Wcast-align -Wunused -Woverloaded-virtual -Wconversion -Wsign-conversion -Wnull-dereference -Wdouble-promotion -Wformat=2 -Wmisleading-indentation -Wduplicated-cond -Wduplicated-branches -Wlogical-op -Wuseless-cast \"${file}\" -o \"${file_path}/${file_base_name}\" && \"${file_path}/${file_base_name}\"", "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$", "working_dir": "${file_path}", "selector": "source.c++, source.cpp, source.cc, source.cxx", "quiet": true }
我想确认:此处被弃用的是否是x的全局声明?
解答
是的,被弃用的就是代码中命名空间作用域的constexpr int S::x;声明。
原因是C++17标准开始,类内定义的static constexpr静态数据成员会被隐式视为inline成员,类内的static constexpr int x = 42;已经完成了成员的定义,不需要再在类外补充这个命名空间作用域的声明。虽然写了这个声明也能正常编译,但属于冗余代码,因此被标准标记为弃用。
至于你没有收到警告的原因:GCC默认不会对这类弃用代码发出警告,需要额外添加-Wdeprecated或-Wdeprecated-declarations编译选项,才能触发对应的弃用警告。你可以把这个选项加入到Sublime构建配置的shell_cmd中的g++参数里。
内容的提问来源于stack exchange,提问作者Spook
相关产品推荐
相关产品推荐

