gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:31:18 26 4
gpt4 key购买 nike

关于标准中的哪个规则说明如下陈述的任何想法:

p++; //where 'p' is pointer to array

不能出现在全局范围内?

如果可能的话,我正在寻找引用,而不仅仅是解释。

最佳答案

表达式 p++你写的是在命名空间范围内。 §7.3.1/1 中定义的 namespace-body 的语法是禁止的:

namespace-body:
     declaration-seqopt



这表示 namespace-body 可以选择包含 仅限 宣言。和 p++肯定不是声明,而是表达式,因此标准隐含地禁止它。标准可能有明确的声明禁止这样做,但我认为以上内容就足够了。

同理,你 不能做这个:
namespace sample
{
f(10,10); //error
std::cout << "hello world" << std::endl;//error
}

但是,如果您以某种方式将表达式转换为声明(或者更确切地说在声明中使用表达式),那么您可以评估所谓的表达式。这是一个技巧:
#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() {}

输出(如果幸运的话):
100
hello world

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

注意 f() 的返回类型是 void ,这意味着我不能写以下内容( see error) :
any a1 = f(10,10); //error

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

上面代码中还有一件有趣的事情:为什么我定义了 any以及其中的模板构造函数?答案是,我写这个是为了给任何类型的值赋值(不是双关语),是 int , std::ostream&管他呢。模板化的构造函数可以接受任何类型的参数。

但是不要写这样的代码。它们不能保证按您期望的方式工作。

阅读本主题中的答案,您将了解为什么此类编码可能很危险:
  • Is main() really start of a C++ program?
  • 关于c++ - 为什么语句不能出现在命名空间范围内?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62138064/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com