gpt4 book ai didi

c++ - 最烦人的解析 : why doesn't `g( ( f() ) );` call `f` 's default constructor and pass the result to `g` 's ctor that takes a `f` ?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:29:25 25 4
gpt4 key购买 nike

这不是 Most vexing parse: why doesn't A a(()); work? 的拷贝,它基于 A a()); 形式的解析,其 OP 认为可以使用额外的集合默认构造一个 A 对象括号。

相比之下,我的问题是关于 2 个类,fg,其中 f 具有默认构造函数,而 g 的构造函数采用 f。我想用一个临时的 f 参数调用 g 的构造函数,而不使用统一的初始化语法。 g 的构造函数中有一个 std::cout 语句,因此缺少输出表示函数声明而不是 g 对象实例化。我在注释中用 3 个数字注释了示例代码。 #1 和 #2 编译时 #3 被注释掉,反之亦然:

#include <iostream>
struct f {};
struct g {
g(f) { std::cout << "g's ctor\n"; }
};
int main() {
// -----Output-----
g( f() ); // #1: function declaration; expected
g( ( f() ) ); // #2: also a function declaration; UNEXPECTED
// g myG( ( f() ) ); // #3: "g's ctor" ONLY if #1 & #2 are commented out;
// ^ ... linker error otherwise
}

#1:我认为#1 声明了一个匿名函数,它返回一个 g 并接受一个指向一个函数的指针,该函数接受 0 个参数并返回一个 f 。我错了吗?

#2: 所以,我认为#2 中额外的一组括号会强制将封闭的内容作为函数调用进行评估,即对 f 的调用的默认构造函数。但它仍然是一个函数声明。为什么?

#3:是#2的变体,区别在于#3添加的实例名myG。如果#1 和#2 被注释掉,#3 实例化对象。否则我会在 VC12 中遇到这些错误:

错误 LNK2019:未解析的外部符号“struct g __cdecl f(void)”(?f@@YA?AUg@@XZ) 在函数 _main 中引用

fatal error LNK1120:1 个 Unresolved external 问题

和 g++ 4.8 中的这个错误:undefined reference to 'f()'

它们是什么意思,我为什么要得到它们?

为什么#3 只有在实例被命名时才是对象实例化?

如何在不命名实例或不使用统一初始化的情况下得到想要的实例化效果?

最佳答案

第一个声明了一个名为 f 的函数不带参数并返回 g .

     g( f() );
// ^ ^ redundant set of parentheses

第二个是相同的,还有另一组多余的括号(请记住,您可以根据需要对相同的函数进行尽可能多的声明)。不过,它们并不总是无用的。例如,您需要它们来声明一个返回函数指针的函数:

// function taking an int and returning
// a pointer to a function that takes a char
// and returns a g
g ( *f(int) )(char);
//^ ^ needed, syntax error without them

至于第三个:

当#1 和#2 出现时,您就得到了 f 的函数声明在 maing myG( ( f() ) );被解析为 g 类型对象的声明, 命名为 myG并使用函数调用的结果进行初始化。您收到链接器错误,因为没有 f 的定义.

当#1和#2被注释掉时,类型f是可见的,并且用括号消除歧义:

g myG( ( f() ) )
// ^ ^ these force an expression

没有那对,你会得到另一个函数声明。

你要的是这个:

   ( g(f()) );
// ^ ^ must be an expression as declarations can't be parenthesized

或更少的 Lisp-y:static_cast<g>(f());

关于c++ - 最烦人的解析 : why doesn't `g( ( f() ) );` call `f` 's default constructor and pass the result to `g` 's ctor that takes a `f` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20647868/

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