c++ - 直接初始化条件内的对象

标签 c++ if-statement initialization c++03

可以在 if 语句的条件内定义和复制初始化变量:

if(int i = 17) { ... }

这也适用于用户定义的类型,因为它们重载了 operator bool :

if(Foo f = 42)      { ... }
if(Foo f = Foo(43)) { ... }

为什么我不能像下面这样使用直接初始化?

if(Foo f(51)) { ... }

GCC 发出 error: expected primary-expression before 'f'

Live on Coliru

除了“因为语法这么说”之外还有其他原因吗?我该如何解决?

我正在使用 VC++03,其中 Foo :

  • 是一个 RAII 敏感对象,我注意没有定义一个复制构造函数
  • 是一个接受用户参数的模板
  • 有一个双参数构造函数

...所以我宁愿避免复制它或重复它的类型。

注意:虽然我的实际问题是 C++03,但我(学术上)对 C++11 中的答案很感兴趣。

最佳答案

在 C++03 中,可以单独使用复制初始化语法:

selection-statement:
       if ( condition ) statement
        […]

condition:
       expression
       type-specifier-seq declarator = assignment-expression

自 C++11 起,添加了列表初始化:

condition:
        expression
       attribute-specifier-seqopt decl-specifier-seq declarator = initializer-clause
       attribute-specifier-seqopt decl-specifier-seq declarator braced-init-list

直接初始化的语法,即 Foo f(…),可能被避免了,原因与它被禁止用于非静态数据成员初始化器的原因相同:歧义,尤其是“最令人烦恼的”解析”。

关于c++ - 直接初始化条件内的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31185404/

相关文章:

c - 使用 CUBLAS/CUSPARSE 操作将统一数组的元素设置为 0 是否安全?

c++ - 无法将 HTML 格式的 unicode(使用 wchar_t)复制到剪贴板

c++ - 确定重定向套接字打开请求的预期 IP 的 POSIX 调用是什么?

c# - (id & 12) 评估什么?

r - 求和直到达到给定值

c++ - 在 vector 初始化中为对象调用非默认构造函数

c++ - 如何在给定地址放置 T* 的拷贝?

c++ - cin 和 getline 跳过输入

c - fork() 与 else

c++ - 如何正确使用初始化语法来初始化结构?