相关疑难解决方法(0)

为什么C++语言设计者会不断重复使用关键字?

支持重新使用短关键字(并添加依赖于上下文的含义)而不仅仅是添加更多关键字的主要论点是什么?

是否只是想要避免破坏可能已经使用建议的新关键字的现有代码,还是有更深层次的原因?

C++ 11中新的"枚举类"让我想到了这一点,但这是一个通用的语言设计问题.

c++ language-design keyword c++11

64
推荐指数
4
解决办法
6276
查看次数

为什么"覆盖"最终是在C++ 11中?

我试图看到为什么在C++ 11中,他们必须override在方法的末尾而不是像开头那样添加关键字virtual.我不明白的是能够写出两种利益virtual,并override在方法的声明.

有没有技术上的原因,为什么委员会不选择简单地写作override而不是virtual在需要时?

谢谢!

c++ c++11

15
推荐指数
2
解决办法
1554
查看次数

是#define/#undef具有特殊含义的标识符是不确定的行为?

在gcc中禁用检查覆盖的问题的答案建议-Doverride=在命令行上使用以禁用错误使用覆盖的错误,这实际上与添加:

#define override
Run Code Online (Sandbox Code Playgroud)

到源文件.

我最初的反应是,这似乎是未定义的行为,因为我们正在重新定义关键字但是查看草案C++ 11标准部分2.12 关键字[lex.key]我很惊讶,无论是覆盖还是最终都不是关键字.它们在上一节2.11 [lex.name]中有所介绍,它说它们是具有特殊含义的标识符:

表3中的标识符在特定情况下出现时具有特殊含义[...]

表3中被标记为具有特殊的含义标识符,并且包括覆盖最后.

问题是,重新定义(使用#define)具有特殊含义的标识符是不确定的行为?在这方面,他们的待遇是否与关键词不同?

c++ undefined-behavior language-lawyer c++11

13
推荐指数
1
解决办法
339
查看次数

为什么nullptr_t不是关键字

以下是声明nullptr_t<cstddef>:

namespace std {
  typedef decltype(nullptr) nullptr_t;
}
Run Code Online (Sandbox Code Playgroud)

根据这个,std::nullptr_t是一个未指定的基本类型的别名nullptr是一个实例.所以实际的类型nullptr没有名称(好吧,语言不给它起名,名称由标准库给出).

nullptr本身就是一个关键字.但标准没有为类型引入关键字nullptr.而是使用decltype(nullptr)提供.

这样做的原因是什么?我觉得很困惑.您需要包含标头并指定std::仅使用语言内置功能.

这是为了保持C++关键字的集合尽可能小吗?这是专门为nullptr委员会或委员会宣布这样的所有新类型,所以namespace std { typedef decltype(false) bool; }如果早些时候作出这样的决定我们会有吗?

c++ c++11

11
推荐指数
1
解决办法
689
查看次数

为什么"覆盖/最终"需要放在函数声明符之后?

我一直想知道决定,为什么overridefinal必须在成员函数声明符之后:

struct Base {
    virtual void virtFun();
};
struct Foo: Base {
    virtual void virtFun() override;
};
Run Code Online (Sandbox Code Playgroud)

对我来说,放置override/ final代替以下内容更合乎逻辑virtual:

struct Base {
    virtual void virtFun();
};
struct Foo: Base {
    override void virtFun();
};
Run Code Online (Sandbox Code Playgroud)

这背后有原因吗?也许与C++ 11之前有一些兼容性问题?

c++

7
推荐指数
1
解决办法
190
查看次数