gpt4 book ai didi

c++ - 为什么这个程序调用operator()而不是构造函数呢?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:07:40 25 4
gpt4 key购买 nike

这是一个编译时没有警告的程序,例如GNU C++:

$ g++ -o t -Wall -pedantic -Wshadow t.cpp

$ ./t.exe
Calling barney::barney()
Calling foo::operator()()
Calling barney::barney()

但它在 MSVC++ 上完全无法编译:

$ cl /EHsc t.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.

t.cpp
t.cpp(17) : error C2380: type(s) preceding 'fred' (constructor with return type, or illegal redefinition of current class-name?)
t.cpp(17) : error C2208: 'fred' : no members defined using this type

而且,当它编译时,输出不是我所期望的。有人可以阐明此代码所需的标准行为是什么吗?

这里是:

#include <iostream>

using ::std::cerr;

struct fred;

struct foo {
inline fred operator ()();
};

struct barney {
barney() : v_(0) { cerr << "Calling barney::barney()\n"; }
int v_;
};

struct fred : public barney {
foo fred;
int joe;
struct fred memfunc() { return fred(); }
};

inline fred foo::operator ()()
{
cerr << "Calling foo::operator()()\n"; return fred();
}

int main(int argc, const char *argv[])
{
fred f;
f.memfunc();
return 0;
}

它输出这个:

Calling barney::barney()
Calling foo::operator()()
Calling barney::barney()

但我希望这样:

Calling barney::barney()
Calling barney::barney()

为什么我得到我做的输出?这是标准行为吗?如果是,为什么,标准的哪些部分是相关的?

除了已接受的答案外,David Rodriguez给了一个excellent answer detailing where it says in the standard that I'm allowed to declare the member named fred of struct fred .

最佳答案

因为在 fred 结构中,您有一个成员 fred(类型为 foo),它隐藏了 struct fred< 的定义。当您执行以下操作时:

return fred();

... fred 指的是 foo 类型的对象,而不是 fred 结构类型,所以 foo () 运算符被调用。

请注意,名称“fred”指的是两个不同的事物 - 类型为 foo 的成员和 fred 结构类型。编译器必须选择其中之一,它会根据 C++ 标准第 3.4 节(“名称查找”)中定义的规则进行选择。

您可以强制 fred 使用 namespace 限定来引用类型:

return ::fred();

关于c++ - 为什么这个程序调用operator()而不是构造函数呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5829744/

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