gpt4 book ai didi

c++ - 为什么此语句不调用构造函数 - C++

转载 作者:太空狗 更新时间:2023-10-29 19:53:00 26 4
gpt4 key购买 nike

一个模板类和一个普通类:

template <typename Type>
class Holder
{
public:
Holder(const Type& value) : held_(value)
{
cout << "Holder(const Type& value)" << endl;
}
Type& Ref() { return held_; }
private:
Type held_;
};

class Animal
{
public:
Animal(const Animal& rhs) { cout << "Animal(const Animal& rhs)" << endl; }
Animal() { cout << "Animal()" << endl; }
~Animal() { cout << "~Animal" << endl; }
void Print() const { cout << "Animal::Print()" << endl; }
};

然后我想实例化一个Holder<Animal>用这个声明 Holder<Animal> a(Animal()); , 但是,它失败了。我是说 Animal()不被视为临时对象。而且这条语句不调用 Holder的构造函数。

谁能解释一下?我不清楚。我猜 a在这里成为一种类型。然后,我使用 Holder<Animal> a = Holder<Animal>(Animal()); ,效果很好。所以,这里有一些情况:

  1. Holder<Animal> a(Animal()); a.Ref().Print(); // error
  2. Holder<Animal> a = Holder<Animal>(Animal()); a.Ref().Print(); // ok
  3. Holder<int> b(4); b.Ref() = 10; cout << b.Ref() << endl; //ok

能解释一下吗?我对第一个陈述有点困惑。以及该语句导致的错误信息:

GCC4.7.2 : error: request for member 'Ref' in 'a', which is of non-class type 'Holder<Animal>(Animal (*)())'

VS10 : error C2228: left of '.Ref' must have class/struct/union , error C2228: left of '.Print' must have class/struct/union

最佳答案

声明Holder<Animal> a(Animal());不创建变量,但声明一个返回 Holder<Animal> 的函数并且在参数中采用一个函数。它通常称为 most vexing parse , 由于这种歧义(人们会期望变量而不是函数声明)。

Herb Sutter 解释了不同的可能语法 here .在 C++11 中,一个可能的解决方案是:

auto a = Holder<Animal> {};

关于c++ - 为什么此语句不调用构造函数 - C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18585573/

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