繁体   English   中英

为什么这个语句不会调用构造函数--C ++

[英]Why this statement does not call the constructors - C++

模板类和普通类:

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.2error: request for member 'Ref' in 'a', which is of non-class type 'Holder<Animal>(Animal (*)())'

VS10error C2228: left of '.Ref' must have class/struct/unionerror C2228: left of '.Print' must have class/struct/union 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>并在参数中获取函数的函数。 它通常被称为最令人烦恼的解析 ,因为这种歧义(人们会期望变量而不是函数声明)。

Herb Sutter在这里解释了不同的可能语法。 在C ++ 11中,一种可能的解决方案是:

auto a = Holder<Animal> {};

你是“最令人烦恼的解析”的受害者:

Holder<Animal> a(Animal()); 被解析为与名称的函数a ,它返回一个Holder<Animal>并采取作为参数的另一个函数,该函数不具有任何参数和返回一个Animal

在C ++ 11中,您可以使用统一初始化来解决该问题:

Holder<Animal> a{Animal{}};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM