C ++术语消歧

时间:2011-11-01 18:45:46

标签: c++

我见过上下文cv-qualifiers中使用的 qualified

  

非限定类型可以隐式转换为const

但我也看到 qualified 用于表示任何嵌套类型:

  

MyClass :: MyNestedType x;


语言标准中的其他同音词是什么?

1 个答案:

答案 0 :(得分:5)

要解决资格的两个含义,请参阅下文......

嗯,在看到真正意图的问题之后:

  • const,mutable(for functions)
  • 删除
    • 用于销毁+释放动态分配的对象
    • 禁止自动生成的特殊班级成员)
  • 自动
    • 以前用于堆栈/静态变量的declspec;
    • 在c ++ 11中的'推断类型'说明符
  • 虚拟
    • 用于虚拟成员函数
    • 用于虚拟基类
  • 使用
    • 用于定义命名空间别名(sic)
    • 用于导入命名空间
    • 用于将限定名称导入当前名称空间
      • 请注意, NOT 表示将使用导入的名称;它只是意味着编译器在启动重载决策时会知道导入的声明。这可能导致SFINAE开始并从另一个命名空间中选择一个完全不同的重载/特化。的混淆 <!/ LI>
    • 用于将名称从基类导入派生类(以防止伪名称隐藏)

语法nits:

  • &代表地址或reference type(有争议 - 不是很混乱)
  • []用于数组索引或lambda声明
  • >>用于右移或关闭嵌套模板定义

    pop-quiz: what is this: 
    
        template <size_t> struct X {};
        std::vector<X<3>> a; // valid? invalid?
    
  • 最令人烦恼的解析:

        std::istream_iterator<int> first(std::cin); // declares a variable
        std::istream_iterator<int> last();          // declares a function
    


资格的含义

(原始回复)

首先是'const / volatile'资格

变量/函数/参数声明包含一个类型。这种类型可以是'const'或'volatile',可以修改类型的语义。

第二个是名称空间限定

C ++可以将名称分组到名称空间中,以避免冲突。 unqalified name 足以引用当前或可见名称空间中声明的标识符:

namespace ns1
{
    struct X {};
    X f();
}

using namespace ns1;
X f2();

然而

  • 引用当前/可见命名空间之外的名称
  • 消除多个名称空间中冲突的可见声明的歧义

你必须使用所谓的“合格”名称:

struct X {} ;
namespace ns2
{
    struct X {};
    ns2::X f();
    ns1::X g();
}

X h(); // uses ::X

using namespace ns2;

::X i();    // disambiguate
ns2::X i();