重新声明静态constexpr数据成员?

时间:2017-11-13 12:42:39

标签: c++

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)

  1. This usage is deprecated usage这里的意思是什么?

    • 定义(C ++ 2014中的声明)
    • 冗余声明(C ++ 2014中的定义)
  2. 这两条评论让我很困惑。 这有两种可能性:

    • 在C ++ 2014(c ++ 14 / 1y)之前,static constexpr int n = 5;definitionconstexpr int A::n;redundant declaration

    • 从C ++ 17开始(或在c ++ 14之后),static constexpr int n = 5;declarationconstexpr int A::n;definition

    II。

    • 从C ++ 17开始(或在c ++ 14之后),static constexpr int n = 5;definitionconstexpr int A::n;redundant declaration

    • 在c ++ 17(包括c ++ 2014)之前,static constexpr int n = 5declarationconstexpr int A::n;definition

    iii,这是真的吗?

2 个答案:

答案 0 :(得分:1)

  1. 不推荐在类之外重新声明constexpr static数据成员。也就是说,在C ++ 17中,你应该只在类中有定义而在外面没有。

  2. 第二个选项:C ++ 17使课堂内的东西成为定义,而外部的东西是冗余声明
    括号回忆一下,在C ++ 14中,它们分别是声明定义

答案 1 :(得分:0)

两者都不正确。我找到了对定义和声明in this answer的好解释:

  

声明“某处,有一个foo”。

     

定义:“......就在这里!”

对于常规类成员,可以在头文件中声明,在实现(cpp)文件中定义

C ++ 17的变化是,当您提供编译时常量作为该类成员的值时,它是定义,您在类定义中定义它。你既不能在课外重新定义它,也不能重新定义它。

  

这种用法已弃用,这里的用法是什么意思?

用法是指重新声明。