gpt4 book ai didi

c++ - 为什么条件中定义的变量不能用参数构造?

转载 作者:IT老高 更新时间:2023-10-28 21:47:14 25 4
gpt4 key购买 nike

问题很简单。为什么会这样编译:

bool b(true);
if (b) { /* */ }

这个编译:

if (bool b = true) { /* */ }

但不是这个:

if (bool b(true)) { /* */ }

在我的真实代码中,我需要构造一个对象并对其进行测试,同时还要在 if block 结束时将其销毁。基本上,我正在寻找这样的东西:

{
Dingus dingus(another_dingus);
if (dingus) {
// ...
}
}

当然,这是可行的:

if (Dingus dingus = another_dingus) { /* */ }

然后我正在构建一个 Dingus 并在其上调用 operator=。对我来说,我可以使用我喜欢的任何构造函数来构造对象,这似乎是合乎逻辑的。

但我很困惑为什么这在语法上不正确。我已经用 G++ 和 MSVC++ 进行了测试,他们都提示这个结构,所以我确定它是规范的一部分,但我很好奇这样做的原因以及可能有哪些不难看的解决方法。

最佳答案

这有点技术性。没有理由不允许你想要的东西,它就是不允许。这是语法。

if 语句是选择语句,语法形式为:

if (condition) statement

这里,条件可以是:

  • 表达式
  • type-specifier-seq declarator = assignment-expression

你有它。允许在条件中声明是一种特殊情况,它必须遵循 that 形式,否则您的程序格式不正确。他们可能允许直接初始化而不是复制初始化,但现在真的没有任何动机这样做。 As Johannes Schaub points out ,这种变化会破坏现有的代码,所以它几乎永远不会发生。

Let_Me_Be 注意到 C++11 添加了第三种形式(这里我忽略了属性):

decl-specifier-seq declarator braced-init-list

所以 if (bool b{true}) 没问题。 (这不可能破坏任何有效的现有代码。)


请注意,您的问题似乎与效率有关:别担心。编译器将忽略临时值,直接构造左侧。但是,这要求您的类型是可复制的(或在 C++11 中可移动)。

关于c++ - 为什么条件中定义的变量不能用参数构造?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8332285/

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