C++标准中最令人惊讶的元素是什么?

Gyö*_*sek 6 c++

我决定更熟悉我最喜欢的编程语言,但阅读标准很无聊.

什么是最令人惊讶,反直觉,或只是简单的C++元素?令你震惊的是你跑到最近的编译器检查它是否真的如此?

我会接受第一个答案,即使我测试之后我也不会相信.:)

hen*_*nle 10

我发现这有点令人惊讶

class aclass
{
public:
int a;
};

some_function(aclass());
Run Code Online (Sandbox Code Playgroud)

a初始化为0in some_function,while

aclass ac;
some_function(ac);
Run Code Online (Sandbox Code Playgroud)

会留下单位资本.如果明确定义默认构造函数aclass:

class aclass
{
public:
aclass(): a() {}
int a;
};
Run Code Online (Sandbox Code Playgroud)

然后 aclass ac; 也会初始化a0.

  • 使用`aclass()`作为参数使编译器填写一个默认的构造函数,将所有内容初始化为默认值.但是当你只声明一个变量时,除非你自己定义了一个默认的构造函数,否则不会调用构造函数. (6认同)

Cha*_*via 9

我可以添加的另一个答案是throw()限定符.例如:

void dosomething() throw()
{
   // ....
}

void doSomethingElse() throw(std::exception)
{
  // ....
}
Run Code Online (Sandbox Code Playgroud)

直观地说,这看起来像是与编译器的契约,表明除了列出的那些之外,不允许该函数抛出任何异常.但实际上,这在编译时没有任何作用.相反,它是一个运行时机制,它不会阻止该函数实际抛出异常.更糟糕的是,如果抛出未列出的异常,它会通过调用来终止您的应用程序std::terminate().

  • Herb Sutter非常详细地解释了为什么你永远不应该写出例外规范:http://www.gotw.ca/publications/mill22.htm (4认同)

Sam*_*ell 8

几个声明符的顺序实际上是无序的:

volatile long int const long extern unsigned x;
Run Code Online (Sandbox Code Playgroud)

是相同的

extern const volatile unsigned long long int x;
Run Code Online (Sandbox Code Playgroud)

  • 我,其中一个,不知道你可以分开"long long int"部分. (9认同)
  • 这真的很令人惊讶吗?小心解释为什么你感到惊讶? (2认同)

Cha*_*via 5

考虑到C++通常是多么无情,我发现有些令人惊讶的是标准实际上允许你使用delete空指针.

  • 我发现很多人在C++中编程并不知道你可以删除空指针. (5认同)
  • 如果你意识到在C`中自由(NULL)`是明确定义的,那就不足为奇了. (3认同)