【问题标题】:Why does this call the default constructor?为什么这会调用默认构造函数?
【发布时间】:2012-07-27 15:31:50
【问题描述】:
struct X
{
    X()    { std::cout << "X()\n";    }
    X(int) { std::cout << "X(int)\n"; }
};

const int answer = 42;

int main()
{
    X(answer);
}

我本来希望这也能打印出来

  • X(int),因为X(answer); 可以解释为从intX 的转换,或者
  • 什么都没有,因为X(answer); 可以解释为变量的声明。

但是,it prints X(),我不知道为什么X(answer); 会调用默认构造函数。

奖励积分:我需要更改哪些内容才能获得临时声明而不是变量声明?

【问题讨论】:

  • X((int)answer);但是会产生正确的结果。
  • @JTA 最后,X(int(answer)); 不打印任何内容,因为它是一个函数声明 :)
  • 什么都没有,因为 X(answer);可以解释为变量的声明。该声明也将是一个定义,它会触发默认构造函数的执行...这反过来意味着您回答了自己的问题。
  • @David double(expresso); 好了,只为你声明 ;)
  • @FredOverflow:我必须要有一个定义才能使用它,因为我感觉没有效果...

标签: c++ syntax most-vexing-parse


【解决方案1】:

什么都没有,因为 X(answer);可以解释为变量的声明。

你的答案隐藏在这里。如果你声明一个变量,你会调用它的默认 ctor(如果不是 POD 和所有这些东西)。

在您的编辑中:要获得一个临时的,您有几个选择:

【讨论】:

  • static_cast&lt;X&gt;(answer) 感觉是“最 C++”的答案——它甚至被旧的 GCC documentation 推荐为强制右值的一种方式。
  • 大括号初始化器不会也可能产生副本吗?
  • @rubenvb:为什么会这样?这只是X(answer) 的一种新奇的表达方式,并保证了 ctor 调用。
  • @Xeo:因为大括号初始值设定项语法按值获取参数? (
  • @KerrekSB 但肯定只有在 C++11 之前,不是吗?现在,标准答案将是X{answer}
【解决方案2】:

括号是可选的。你说的和X answer;一样,是声明语句。

【讨论】:

    【解决方案3】:

    如果你想声明一个X类型的变量,你应该这样做:

    X y(answer);
    

    【讨论】:

    • 他没有问如何让它调用X(int) ctor。
    • 是的,但我有一种小小的感觉,那就是他要做的事情:)
    • @WouterH:实际上,知道 Fred,这不太可能。他是那些喜欢探索 C++ 标准的黑暗角落并尝试理解它的人之一。在某个角色扮演游戏中,他已经失去了所有理智点;)
    猜你喜欢
    • 2020-10-10
    • 2022-01-09
    • 1970-01-01
    • 2013-03-20
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多