ISO标准3.1的声明:来自n3242 doc的第1点

时间:2011-03-31 06:14:28

标签: c++ c++11

ISO标准3.1美元声明:第1点

n3242说:

  

声明(第7条)可以   在a中引入一个或多个名字   翻译单位或重新声明的名称   由先前的声明引入。   如果是,则声明指定   解释和这些属性   名。声明也可能有   效果包括:        - 静态断言(第7条),        - 控制模板实例化(14.7.2),        - 使用属性(第7条),和        - 没有(在空声明的情况下)。

ISO 2003 DOC说:

  

声明(第7条)介绍   姓名到翻译单位或
  重新声明的名字由   以前的声明。声明
  指定解释和   这些名字的属性。

可以解释有什么区别。

他们说“声明也可能产生影响,包括:”......任何人都可以解释这些效果在编程方面是什么

请用编程方式解释这些效果(使用示例程序)?

1 个答案:

答案 0 :(得分:3)

我认为只是一些新功能改变了声明的工作方式 - 在细节上。

例如,这不仅会引入一些名称,还会影响代码的编译。

struct A
{
  int x;
};

struct B
{
    A  a;
    static_assert(sizeof(a) > 10, "Wrong member size");
};

我们还有空声明(我相信它只能在一个类中使用)

struct C
{
  void f()
  { };      // Semicolon here is allowed, but is an empty declaration
};

空声明是一个声明,引入一个名称(因为它是空的)。

我想:“影响模板实例化”,我认为:

template<class T>
class X
{
   // some members
};

extern template class X<int>;
extern template class X<char>;

告诉编译器X<int>X<char>将在其他地方实例化,而不必在此处生成。