首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在“for-循环”中声明变量的“构造函数-方式”是允许的,而在“if-语句”中却不允许?

为什么在“for-循环”中声明变量的“构造函数-方式”是允许的,而在“if-语句”中却不允许?
EN

Stack Overflow用户
提问于 2012-09-29 21:32:15
回答 2查看 761关注 0票数 15

可能重复: 为什么不能用参数来构造条件中定义的变量?

考虑一下这个简单的例子:

代码语言:javascript
复制
/*1*/ int main() {
/*2*/   for (int i(7); i;){break;} 
/*3*/   if (int i(7)) {}
/*4*/ }

为什么第2行编译得很好,而第3行给出了错误?这对我来说有点奇怪,为什么如果-语句在这方面被处理得比循环更糟糕?

如果这是编译器特有的-我用gcc-4.5.1进行了测试

prog.cpp:在函数'int ():prog.cpp:3:7: prog.cpp:3:7: error:预期主表达式'int‘prog.cpp:3:7:prog.cpp:3:7: expected’之前的表达式

我受到这个问题的启发

更新

我知道这汇编得很好:

代码语言:javascript
复制
/*1*/ int main() {
/*2*/   for (int i = 7; i;){break;} 
/*3*/   if (int i = 7) {}
/*4*/ }

UPDATE2

这似乎是纯粹的学术问题--但对于不能复制的std::unique_ptr<>这类类型来说,这可能是极其重要的:

代码语言:javascript
复制
#include <memory>
int main() {
  if (std::unique_ptr<int> i = new (std::nothrow) int(7)) {
  }
  if (std::unique_ptr<int> i(new (std::nothrow) int(7))) {
  }
}

这两种都不允许。不确定新的C++11语法{}

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-29 21:41:16

C++标准没有提供一个基本原理,但我怀疑使用构造函数表示法可能会导致一些不一致。例如,由于函数声明在if语句中是不允许的,所以最令人烦恼的解析实际上意味着所期望的结果。例如:

代码语言:javascript
复制
int f();        // function declaration (simple form or the most vexing parse)
if (int f()) {  // illegal in C++ but, when allowed, would be a zero-initialized int
}

在C++ 2011中,您可以使用大括号初始化:

代码语言:javascript
复制
if (int x{f()}) {
    ...
}

不幸的是,大括号初始化并不总是意味着使用构造函数表示法(我认为它被称为直接初始化)。

关于更新:您可以使用其中之一:

代码语言:javascript
复制
if (std::unique_ptr<int> p = std::unique_ptr<int>(new int(1))) { ... }
if (auto p = std::unique_ptr<int>(new int(2))) { ... }
if (std::unique_ptr<int>{new int(3)}) { ... }

似乎有很多选择:

票数 11
EN

Stack Overflow用户

发布于 2012-09-29 22:14:27

就语法而言,原因很简单。

for语句的第一个元素是语句。语句可以创建变量,也可以初始化变量。if条件是一个条件。规范确实定义了条件可以创建变量,但只能通过=初始化。

更高兴的是,规范甚至允许您在if中创建变量。它必须有特殊的语法,甚至允许(“条件”与“表达式”不同),这可能是从C继承下来的。

话虽如此,C++11确实将条件定义为能够用大括号内的列表初始化声明(规范-表示“初始化程序列表”)。所以应该是合法的。但是由于VS2012还不支持初始化程序列表.

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12656655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档