为什么语句不能出现在命名空间范围内?

use*_*635 2 c++ standards compiler-errors

关于标准中哪条规则的任何想法都说明了这样的陈述:

p++; //where 'p' is pointer to array
Run Code Online (Sandbox Code Playgroud)

不能出现在全球范围内?

如果可能的话,我正在寻找一个参考,而不只是一个解释.

Naw*_*waz 13

p++您编写的表达式位于命名空间范围内.命名空间主体的语法禁止它在§7.3.1/ 1中定义为:

namespace-body:
     declaration-seq opt

其中,namespace-body可以选择 包含声明.并且p++肯定不是声明,它是一个表达,因此标准隐含地禁止它.标准可能有明确的声明禁止这一点,但我认为上述内容应该足够了.

以同样的方式,你不能这样做:

namespace sample
{
  f(10,10); //error
  std::cout << "hello world" << std::endl;//error
}
Run Code Online (Sandbox Code Playgroud)

但是,如果您将表达式转换为声明(或者更确切地说在声明中使用表达式),那么您可以评估所谓的表达式.这是一招:

#include<iostream>

namespace sample
{
  struct any { template<typename T> any(const T&){} };

  void f(int a,int b) { std::cout << a * b <<  std::endl; }

  any a1= (f(10,10), 0); //ok
  any a2 = std::cout << "hello world" << std::endl;//ok
}

int main() {}
Run Code Online (Sandbox Code Playgroud)

输出(如果你很幸运):

100
hello world
Run Code Online (Sandbox Code Playgroud)

在线演示:http://ideone.com/icbhh

请注意返回类型f()void,这意味着我无法编写以下内容(请参阅错误):

any a1 = f(10,10); //error
Run Code Online (Sandbox Code Playgroud)

这就是为什么我使用逗号运算符以便表达式可以有一些值,它会计算到逗号表达式中的最后一个操作数.如果std:cout,因为它返回std::ostream&,我不需要使用逗号运算符; 没有它,没关系.

上面代码中还有一个有趣的事情:为什么我定义any了一个模板化的构造函数呢?答案是,我写了这个,这样我可以分配的值的任何类型的(没有双关语意),是它int,std::ostream&或什么的.该模板的构造可以采用任何类型的参数.

但是不要写这样的代码.他们无法保证以您期望的方式工作.

阅读本主题中的答案,您将看到为何此类编码可能存在危险: