N4687:
[附件D(规范性)兼容性特征]
D.1静态constexpr数据成员的重新声明
1为了与以前的C ++国际标准兼容,constexpr静态数据成员可能是冗余的 在课外重新申报,没有初始化程序。不推荐使用此用法。 [例如:
struct A {
static constexpr int n = 5; // definition (declaration in C++ 2014)
};
constexpr int A::n; // redundant declaration (definition in C++ 2014)
- 结束示例]
我没有良好的英语水平,所以在学习标准时我遇到了几个问题(我只是来自使用odr)
This usage is deprecated
usage
这里的意思是什么?
岛
在C ++ 2014(c ++ 14 / 1y)之前,static constexpr int n = 5;
是definition
。 constexpr int A::n;
是redundant declaration
。
从C ++ 17开始(或在c ++ 14之后),static constexpr int n = 5;
是declaration
。 constexpr int A::n;
是definition
II。
从C ++ 17开始(或在c ++ 14之后),static constexpr int n = 5;
是definition
。 constexpr int A::n;
是redundant declaration
。
在c ++ 17(包括c ++ 2014)之前,static constexpr int n = 5
是declaration
。 constexpr int A::n;
是definition
。
i
和ii
,这是真的吗?
答案 0 :(得分:1)
不推荐在类之外重新声明constexpr static
数据成员。也就是说,在C ++ 17中,你应该只在类中有定义而在外面没有。
第二个选项:C ++ 17使课堂内的东西成为定义,而外部的东西是冗余声明。
括号回忆一下,在C ++ 14中,它们分别是声明和定义。
答案 1 :(得分:0)
两者都不正确。我找到了对定义和声明in this answer的好解释:
声明“某处,有一个foo”。
定义:“......就在这里!”
对于常规类成员,可以在头文件中声明,在实现(cpp)文件中定义。
C ++ 17的变化是,当您提供编译时常量作为该类成员的值时,它是定义,您在类定义中定义它。你既不能在课外重新定义它,也不能重新定义它。
这种用法已弃用,这里的用法是什么意思?
用法是指重新声明。