我不明白他们所谓的deprecated指的是什么?是不是说x 的全局声明被废弃了?

编程语言 2026-07-08

英语不是我的母语。我尝试过使用翻译工具,但都没用。我正通过 cppreference 来理解这段内容。

(deprecated) 使用 constexpr 说明符,在类内定义的静态数据成员的命名空间作用域声明:

struct S
{
    static constexpr int x = 42; // implicitly inline, defines S::x              
};

constexpr int S::x; // declares S::x, not a redefinition

(自C++17起)

首先,我知道deprecated的含义是某些东西已经不再需要。

我不理解的是,自C++17以来到底有哪些东西被弃用?因为我并不确切知道。我尝试在不同的C++版本之间切换,希望能得到一个错误或警告,告诉我哪里出错了,但没有任何提示,代码照样工作,那么到底有哪些被弃用?

编译器版本:gcc 16.1

C++版本:当前使用C++17

我的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
}

解决方案

请参阅这里 https://cppreference.com/cpp/language/static,了解静态成员:

一个constexpr静态数据成员是隐式内联的,不需要在命名空间作用域重新声明。这个没有初始化的重新声明(以前需要)仍然允许,但已被弃用。

这与您引用中的同一变更有关,该变更随 C++17 一起出现。也就是说,constexpr 静态成员是隐式内联的,不需要在命名空间作用域重新声明。你仍然可以这么做,但并非必须。因此,我同意cppreference上的 deprecated 标签具有误导性。你仍然可以重新声明静态成员,它不是一个ODR违规。那点并没有改变。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章