莫名其妙的行为:在 C++ primitives/objects 初始化中没有参数的圆括号

Inexplicable behaviour: round brackets without parameters in C++ primitives/objects initialization

在 C++ 中对对象和原语的初始化(和默认构造函数)进行了一些简单的尝试,我发现了一个我不理解的行为,所以我需要帮助。

我们先来谈谈基元类型。

我测试的代码如下:

int main() {

    int i(5);
    cout<<i<<endl;

    int j();
    cout<<j<<endl;

    int k;
    cout<<k<<endl;

    return 0;
}

我得到的结果是这样的:

5
1
6487956

很明显我在关注第一个结果(对象样式的初始化),还有第三个(不是初始化值),但是第二个呢?关于第二个,我正在考虑默认初始化,而是收到一条警告,告诉 "the address of 'int j()' will always evaluate as 'true'"... 事实上打印结果是 1,但是原始变量附近的空圆括号是什么样的语法?

现在关于对象,情况类似... 代码是:

class Pluto {
public:
    int a;
    int b;
    Pluto() {
        a = 0;
        b = 0;
        std::cout<<"Constructor call"<<std::endl;
    }
}

int main() {
    Pluto p();
}

我有一个带有默认构造函数的 class,我在其中放置了打印以强调它的调用,然后我声明了一个与前一种情况具有相似语法的对象,我期待调用到默认构造函数,而我在输出中什么也得不到,所以没有调用构造函数。 在下一次测试中,我尝试访问对象的成员,但出现错误 "Field 'a' could not be resolved".

我确定我的问题的答案是愚蠢和明显的,但现在我真的找不到,所以感谢谁能帮助我。

j 是一个函数,因为任何可以被解析为函数声明的东西都被解析为一个。

这通常被称为 C++ 的“最令人烦恼的解析”。

作为一个函数,它不会隐式转换为 void*(这是一个数据指针),但它会转换为 bool,并且它不是空的,所以你得到合乎逻辑的 true,显示为 1,因为这是 boolvalues.

的默认显示

即,你得到这个转换链:functionfunction pointerboolean (这是 true 因为指针不为空)和 → 呈现为 1.

您可以使用 std::boolalpha 操纵器更改布尔值的显示方式,例如 cout << boolalpha;。然后你得到的不是 1,而是输出 true。我更喜欢这种模式。


您想要或需要指定默认初始化的一个简单解决方案是使用大括号:

int j{};