【问题标题】:Is the classname() equivalent to a class object?classname() 是否等同于类对象?
【发布时间】:2012-07-22 00:28:52
【问题描述】:

我知道这可能是一个愚蠢的问题,但我不确定如何正确描述它。 例如,当我尝试调用 std::transform 函数时,

template < class InputIterator, class OutputIterator, class UnaryOperator >
  OutputIterator transform ( InputIterator first1, InputIterator last1,
                             OutputIterator result, UnaryOperator op )

可以写UnaryOperator op;,然后调用transform(..,..,.., op);

但是我也看到人们只写transform(..,..,..,UnaryOperator());

我的问题是:classname() 是否等同于类对象?

【问题讨论】:

    标签: c++ transform function-object


    【解决方案1】:

    我不知道classname()到底是什么意思,但是当你这样写时:

    UnaryOperator op;
    transform(..,..,.., op);
    

    ...您创建UnaryOperator 类的op 对象并将其传递给transform。它的生命周期取决于定义它的范围。 IE。你可以在拨打transform之后访问它。

    当你这样写时:

    transform(..,..,.., UnaryOperator());
    

    ...您实际上创建了一个UnaryOperator 类的临时对象并将其传递给transform 函数,它的生命周期与表达式相关联。此外,在这种情况下,它将是常量引用或“右值”。而在第一种情况下,它要么是非常量引用,要么是常量引用。

    【讨论】:

    • 谢谢,你的意思是当你写 UnaryOperator() 时,你调用的是默认构造函数。
    • 表达式 UnaryOperator() 始终是一个右值。但是,根据上下文,可以将相同的文本解析为声明。
    • @Cheersandhth.-Alf 你说得对,对于函数等待像&amp;&amp; (C++11) 这样的右值引用的情况,正确的名称是什么?
    • @ephemerality:是的,在这种情况下。正如 Cheersandhth 所指出的,这也可能意味着声明。
    【解决方案2】:

    对于给定类型T,在正确的情况下,表达式T() 计算为T 类型的临时、默认构造对象。以下是一些可以使用的情况:

    // Ex 1:
    T x; x = T();   // overwrite `x` with a copy of a default-T
    
    // Ex 2:
    T x = T();      // copy-initialize from default-T (probably elided)
    
    // Ex 3 (note that temporaries bind to const&):
    void foo(int n = 10, T const & t = T());  // default argument
    
    // Ex 4:
    std::string format_me(int a)
    {
        return static_cast<std::ostringstream&>(std::ostringstream() << a).str();
        //                            temporary ^^^^^^^^^^^^^^^^^^^^
    }
    

    注意T() 有其他含义的情况:

    {
        T t(T());   // `t` is _not_ an object of type T!
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-12
      • 1970-01-01
      • 2023-03-19
      • 2020-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      相关资源
      最近更新 更多