You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 07:03:08