什么是int()调用?

Jon*_*Mee 15 c++ primitive construction initialization nomenclature

它已被反复重复,原始类型没有构造函数.例如_bar,当我调用时,这不会初始化为0 Foo():

class Foo{
    int _bar;
};
Run Code Online (Sandbox Code Playgroud)

所以显然int()不是构造函数.但它的名字什么?

在这个例子中我会说i:(构造?初始化?fooed?)

for(int i{}; i < 13; ++i)
Run Code Online (Sandbox Code Playgroud)

Loki Astari 在这里提到该技术有某种名称.

编辑回应Mike Seymour:

#include <iostream>

using namespace std;

class Foo{
    int _bar;
public:
    void printBar(){ cout << _bar << endl; }
};

int main()
{
    Foo foo;

    foo.printBar();

    Foo().printBar();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在Visual Studio 2013上运行此代码产生:

3382592
3382592

有趣的是gcc 4.8.1收益率:

134514651
0

Mik*_*our 8

它已被反复重复,原始类型没有构造函数.

那就对了.

例如,当我打电话时,此栏未初始化为0 Foo()

是的.Foo()指定value-initialisation,对于没有用户提供的构造函数的类,这意味着它在初始化其成员之前是零初始化的.因此_bar最终得到零值.(尽管如评论中所述,一个流行的编译器没有正确地初始化这些类.)

如果您使用默认初始化,则不会初始化.你暂时无法做到这一点; 但是声明的变量Foo f;或对象new F将被默认初始化.原始类型的默认初始化没有任何作用,使它们具有不确定的值.

如果类具有用户提供的默认构造函数,并且该构造函数没有专门初始化,那么它也不会被初始化_bar.同样,它将默认初始化,没有任何效果.

所以显然int()不是构造函数.但它的名字是什么?

作为表达式,它是类型初始化的临时类型int.

从语法上讲,它是"显式类型转换(功能表示法)"的特例; 但是将该术语用于类型转换以外的任何事情都会让人感到困惑.

在这个例子中我会说i:(构造?初始化?fooed?)

初始化.列表初始化(使用空列表),值初始化或零初始化,如果您想更具体.

  • @JonathanMee:你的编译器坏了:https://connect.microsoft.com/VisualStudio/feedback/details/484295 (5认同)
  • @JonathanMee:不,那是正确的做法.第一个是默认初始化,使其具有不确定的值; 第二个是正确的零初始化. (4认同)
  • @JonathanMee你可以测试[这里](http://rise4fun.com/vcpp),它已在vc2015中成功修复 (4认同)
  • @gldraphael:整个类对象是零初始化的,它具有将`_bar`初始化为零的效果. (3认同)
  • @JonathanMee:[我没有](http://ideone.com/ibIboe).也许您的编译器不会根据标准对对象进行初始化. (2认同)

Lig*_*ica 6

这是什么int()(记住,在语法上,int是一个简单类型说明符):

[C++11: 5.2.3/1]:简单型说明符(7.1.6.2)或类型名称说明符后跟带括号的(14.6)表达式列表构建体给出的表达式列表中指定的类型的值.如果表达式列表是单个表达式,则类型转换表达式与相应的强制转换表达式(5.4)等效(在定义中,如果在含义中定义).如果指定的类型是类类型,则类类型应完整.如果表达式列表指定多个值,则该类型应为具有适当声明的构造函数的类(8.5,12.1),并且该表达式T(x1, x2, ...)与声明的效果等效T t(x1, x2, ...); 对于一些发明的临时变量t,结果是t作为prvalue 的值.

通俗地讲,它代表了一个int带有空初始化器的临时构造.不过,我认为你很难找到整个结构的正式名称.

这与使用初始化器的命名对象int i{}的完整声明不同:您i已声明,构造和初始化.

(我不认为这与Loki在对该相关答案的评论中所说的内容有关.)

  • 嗯...你几乎把它钉了,除了更好的引用将是下一段:*表达式`T()`,其中`T`是单一类型说明符...创建指定类型的prvalue ,**值初始化*** (4认同)