相关疑难解决方法(0)

我对值初始化的尝试被解释为函数声明,为什么不是A a(()); 解决这个问题?

Stack Overflow教给我的很多东西都是所谓的"最令人烦恼的解析",经典地用一条线来证明

A a(B()); //declares a function
Run Code Online (Sandbox Code Playgroud)

虽然这对于大多数人而言,直观地看起来是a类型对象的声明A,将临时B对象作为构造函数参数,它实际上是一个函数a返回的声明A,将一个指针指向一个返回的函数,它B本身不带参数.同样的线

A a(); //declares a function
Run Code Online (Sandbox Code Playgroud)

也属于同一类别,因为它代替一个对象,它声明了一个函数.现在,在第一种情况下,这个问题的通常解决方法是在其周围添加一组额外的括号/括号B(),因为编译器会将其解释为对象的声明

A a((B())); //declares an object
Run Code Online (Sandbox Code Playgroud)

但是,在第二种情况下,执行相同操作会导致编译错误

A a(()); //compile error
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么?是的我非常清楚正确的"解决方法"是将其更改为A a;,但我很想知道()第一个示例中的额外功能是什么,然后在重新应用它时不起作用第二个例子.A a((B()));变通办法是否是写入标准的特定异常?

c++

154
推荐指数
5
解决办法
2万
查看次数

变量是否只能在if语句的范围内定义,类似于for循环的常规方式?

有没有办法在if构造中声明,赋值和比较变量到表达式,使得它只在if构造的范围内定义?

这是有效的(声明和赋值,但当然条件只是函数f的返回值等于或等于零):

int main()
{
  if(int i = f())
  {
    printf("%d", i);
    // i is defined here!
  }
  else
  {
    // Here too!
  }
  // But not here!
}
Run Code Online (Sandbox Code Playgroud)

但是当我尝试将i的值与实际表达式进行比较时,我遇到了麻烦:

int main()
{
  // Does not compile because "int i = f()" is not a primary expression?
  if((int i = f()) == 3)
  {
    printf("%d", i);
  }
}
Run Code Online (Sandbox Code Playgroud)

从行为的角度来看,如果构造类型可以创建整个范围,但在我看来它看起来很难看:

int main()
{
  {
    int i = f();
    if(i == 3)
    {
      printf("%d", i);
      // i is defined here!
    }
    // …
Run Code Online (Sandbox Code Playgroud)

c++ scope if-statement declaration

3
推荐指数
1
解决办法
157
查看次数

标签 统计

c++ ×2

declaration ×1

if-statement ×1

scope ×1