gpt4 book ai didi

c++ - 为什么编译器调用默认构造函数?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:12:30 24 4
gpt4 key购买 nike

为什么我会收到以下错误? (为什么编译器要尝试调用默认构造函数?)

#include <cmath>

template<typename F> struct Foo { Foo(F) { } };

int main()
{
Foo<double(double)>(sin); // no appropriate default constructor available
}

最佳答案

因为没有区别

 Foo<double(double)>(sin);   

 Foo<double(double)> sin;   

两者都声明了一个名称为 sin 的变量。

括号是多余的。你可以放任意数量的括号。

int x;             //declares a variable of name x
int (x); //declares a variable of name x
int ((x)); //declares a variable of name x
int (((x))); //declares a variable of name x
int (((((x))))); //declares a variable of name x

都一样!

如果你想创建类的临时实例,将sin作为参数传递给构造函数,那么这样做:

#include<iostream>
#include <cmath>

template<typename F>
struct Foo { Foo(F) { std::cout << "called" << std::endl; } };

int main()
{
(void)Foo<double(double)>(sin); //expression, not declaration
(Foo<double(double)>(sin)); //expression, not declaration
(Foo<double(double)>)(sin); //expression, not declaration
}

输出:

called
called
called

演示:http://ideone.com/IjFUe

它们有效,因为所有三种语法都强制它们成为表达式,而不是变量 声明。

但是,如果您尝试这样做(正如@fefe 在评论中建议的那样):

 Foo<double(double)>(&sin);  //declaration, expression

它不会工作,因为它声明了一个引用变量,并且由于它没有被初始化,你会得到编译错误。请参阅:http://ideone.com/HNt2Z

关于c++ - 为什么编译器调用默认构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8263795/

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