【问题标题】:Passing typedef with parenthesis as an argument将带括号的 typedef 作为参数传递
【发布时间】:2015-01-15 09:19:09
【问题描述】:

我发现了一段带有奇怪参数的代码,它是一种类型:

#include <iostream>
using namespace std;

template<class T>
int function1(T count,double)
{
    cout<<"function1 is called"<<endl;
    return 1111;
}

int main()
{
    typedef int aaaa;
    function1(1,aaaa()); 
}

而这个函数的输出是

function1 被调用

我想知道当参数是类型时是什么意思?为什么我要给出函数aaaa(),而没有括号的aaaa会给出编译器错误?

error: expected primary-expression before ‘)’ token
  function1(1,aaaa); 
                  ^

【问题讨论】:

  • 它创建一个该类型的临时对象。

标签: c++ templates c++11 types typedef


【解决方案1】:

function1(1, aaaa) 等价于 function1(1, int) - 您正在尝试将类型作为参数传递,这是格式错误的。

function1(1,aaaa())aaaa() 中创建一个临时int,其值为0。参见例如 C++14 草案 N4140 [expr.type.conv]/2:

表达式T(),其中Tsimple-type-specifiertypename-specifier,用于非数组完整对象类型或(可能cv-qualified) void 类型,创建指定类型的纯右值,其值是通过值初始化(8.5)T 类型的对象产生的;

【讨论】:

  • 创建一个永远不会被使用的临时值有什么好处?
  • @Gordon 为什么它永远不会被使用?你将它传递给一个函数。如果问题是,写aaaa() 而不仅仅是0 有什么好处 - 它在aaaa 是模板参数的模板代码中可能很有用,所以你现在不要提前输入它的类型。
  • 不,我的问题是,从函数的角度来看,为什么函数需要接收未使用的变量。这个函数对 double 类型有什么作用?我猜它是用于函数重载的。
  • @Gordon 这是一个未使用的参数,它不必有名字。它存在的原因可能是历史性的——它可能以前被使用过。它也可能是一个虚函数的实现,或者一些回调。
【解决方案2】:

T(); 其中T 是任何类型都会创建T 类型的无名临时。创建的对象是value initialized。应用于aaaa(即inttypedef)时,会创建一个临时的int,并将其赋值为0

【讨论】:

    猜你喜欢
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-11
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    • 2019-01-28
    相关资源
    最近更新 更多