相关疑难解决方法(0)

为什么C++允许我们在声明变量时用括号括起变量名?

例如,声明如下:

int (x) = 0;
Run Code Online (Sandbox Code Playgroud)

甚至是:

int (((x))) = 0;
Run Code Online (Sandbox Code Playgroud)

我偶然发现了这一点,因为在我的代码中我碰巧有一个类似于下面的片段:

struct B
{
};

struct C
{
  C (B *) {}
  void f () {};
};

int main()
{
  B *y;
  C (y);
}
Run Code Online (Sandbox Code Playgroud)

显然,我想构造一个对象C,然后在它的析构函数中做一些有用的东西.但是,当它发生时,编译器将其C (y);视为y带有类型的变量声明,C因此它会输出有关y重新定义的错误.有趣的是,如果我把它写成C (y).f ()或类似的东西C (static_cast<B*> (y))将按预期编译.当然,最好的现代解决方法是{}在构造函数调用中使用.

因此,当我在那之后发现,可以声明变量之类的int (x) = 0;甚至是,int (((x))) = 0;但我从未见过任何人实际使用这样的声明.所以我很感兴趣 - 这种可能性的目的是什么,因为现在我看到它只创造了类似于臭名昭着的"最令人烦恼的解析"的情况,并没有添加任何有用的东西?

c++ most-vexing-parse

81
推荐指数
2
解决办法
4725
查看次数

C++名称解析(和重载)规则列表

在哪里可以找到符合C++的编译器必须应用的规则列表才能执行名称解析(包括重载)?

我喜欢自然语言算法或流程图.

C++标准当然有这套规则,但随着新语言语句的引入而逐渐形成,结果很难记住.

总而言之,我想知道" 当它看到名字'A'时编译器会做什么的完整而详细的答案?"

我知道C++就是" 我们在X时这样做,但如果Z持有则不是Y "所以,我在问是否有可能使它更加线性.

编辑:我正在研究这个主题的草稿,一旦发布,可以集体改进.然而,这些天我很忙,可能需要时间来宣传一些东西.如果有兴趣我会将"关于原始txt文件的个人笔记"推广到更好的东西并发布.

c++ rules token-name-resolution

40
推荐指数
1
解决办法
4172
查看次数

如何在C++中创建临时对象

我有以下代码.

class A {
 public:
  A(int) {
  }
};

int a;
int main() {
  A(a);  // Line 'a
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我想在第一行做的是A用构造函数创建一个临时的A::A(int).我知道它会立即毁灭.这就是我想要的.但似乎编译器正在做一些等价的事情A a,a在类中定义变量A并使用构造函数初始化它A::A().当然它不存在,因此编译错误.

但是,如果我将我的代码更改为以下内容.

class A {
 public:
  A(int) {
  }
};

void f(A) {
}

int a;
int main() {
  f(A(a));
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

它现在工作正常.编译器构造一个临时的A并使用它来调用f.

为什么A(a)两种情况都不同?它是如何在标准中或出于某些模糊的原因陈述的?如何在第一个代码示例中构造临时对象?

c++

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