7

根据 C++11 标准,§7.3.3[namespace.udecl]/1:

using-declaration 将名称引入到 using-declaration 出现的声明性区域中。

使用声明

using typenameopt 嵌套名称说明符 unqualified-id ;
using :: unqualified-id ;

在 using-declaration 中指定的成员名称在 using-declaration 出现的声明区域中声明。

在使用声明发生的声明区域中声明的名称是什么意思?

这是否意味着将该名称引入到使用声明发生的声明区域中?

声明名称和声明名称所表示的实体之间也有区别吗?

例子:

namespace N { static int i = 1; } /* Declares an entity denoted by 
    the name i in the declarative region of the namespace N. 
    Introduces the name into the declarative region of the namespace N.
    Declares the name i in the declarative region of the namespace N? */
using N::i; /* Declares the name i in the declarative region of the
    global namespace. Also introduces that name into the declarative
    region of the global namespace? Also declares the entity that the
    name i denotes? */ 
4

2 回答 2

6

根据第一原理,实体是,来自 [基本]

值、对象、引用、函数、枚举器、类型、类成员、位域、模板、模板特化、命名空间、参数包或this. [...] 每个表示实体的名称都由声明引入。

声明声明事物。被声明意味着它是由一个声明引入的,来自 [basic.scope.declarative]

每个名称都被引入程序文本的某个部分,称为声明性区域,这是程序中该名称有效的最大部分,也就是说,该名称可以用作非限定名称来引用同一实体.

由声明声明的名称被引入声明发生的范围,除了说明符 (11.3) 的存在、详细类型说明符(7.1.6.3) friend的某些使用和使用指令(7.3. 4)改变这种一般行为。

这些例外都与这里无关,因为我们谈论的是using-declarations而不是using-directives。让我稍微改变一下你的例子,以避免全局命名空间:

namespace N {        //  + declarative region #1
                     //  |
    static int i;    //  | introduces a name into this region
                     //  | this declaration introduces an entity
}                    //  +

因此,首先,N::i是一个在命名空间中声明N并引入N. 现在,让我们添加一个using-declaration

namespace B {        //  + declarative region #2
                     //  |
    using N::i;      //  | declaration introduces a name i
                     //  | but this is not an entity
}                    //  +

从 [namespace.udecl],我们有:

如果using-declaration命名了一个构造函数 (3.4.3.1),它会在出现 using-declaration 的类中隐式声明一组构造函数 (12.9);否则,在using-declaration中指定的名称是另一个命名空间或类中的一组声明的 同义词

using-declaration using N::i没有命名构造函数,因此与其将名称i作为新实体,不如将其作为N::i.

所以基本上,两个is 都是在各自的命名空间中引入和声明的名称。在N, 中i声明了一个具有静态链接的实体,但在B,中i声明了该实体的同义词——而不是新实体。

于 2015-07-29T20:56:24.493 回答
0

在使用声明发生的声明区域中声明的名称是什么意思?

我将尝试以我对它的理解的示例来回答这个问题(请参阅我在描述的代码中的评论):

// "namespace X {}" introduces a declarative region of the namespace X
namespace X {
  //The name SomeObject is now introduced into the declarative region X
  // It is only visible in that declarative region
  using Y::SomeObject;
}//Declarative region X ENDS here
// SomeObject NOT visible here

下面是一个示例,其中(编译器)错误清楚地表明了名称不可见的位置:

#include <iostream>

namespace A
{
  struct X{};
}

namespace B
{
  struct X{};
}

namespace C
{
  using A::X;

  void foo(X){}
}

namespace D
{
  using B::X;

  void foo(X){}
}

void foo(X){} //FAILS TO COMPILE - DELIBERATE!!!

int main() 
{
    return 0;
}
于 2015-07-29T20:14:48.387 回答