我不明白他们所谓的deprecated指的是什么?是不是说x 的全局声明被废弃了?
英语不是我的母语。我尝试过使用翻译工具,但都没用。我正通过 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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。