无法命名的C++类型

kir*_*kun 20 c++ templates types decltype c++11

在阅读维基百科关于decltype的页面时,我很好奇这个陈述,

其[decltype]的主要用途是在通用编程中,通常很难甚至不可能命名依赖于模板参数的类型.

虽然我可以理解该语句的难点部分,但是需要命名一个无法在C++ 03下命名的类型的示例是什么?

编辑:我的观点是,因为C++中的所有内容都有类型声明.为什么会出现无法命名类型的情况?此外,是不是设计用于产生类型信息的特质类?特质课可以替代decltype吗?

Phi*_*ter 13

您链接的维基百科页面有一个完美的例子:

int& foo(int& i);
float foo(float& f);

template <class T> auto transparent_forwarder(T& t) ?> decltype(foo(t)) {
  return foo(t);
}
Run Code Online (Sandbox Code Playgroud)

注意,foo(int&)返回int&(引用类型),而foo(float&)返回float(非引用类型).如果没有decltype,则在模板中不可能指定一个表示"采用类型foo参数的函数的返回t类型T" 的类型.

在这个例子中,它不是一个不可能表达的特定具体类型 - 无论是int&或者float可单独表达 - 而是更高级别的通用类类型.

编辑:并回答你对另一个答案的评论,这个例子在C++ 03中难以形容.你不能有一个函数模板,它将包装任何函数T1 foo(T2)并匹配包装函数的参数和返回类型.


Jer*_*ock 11

C++ 0x中有类型(在C++ 03中,但不常见),无法明确命名,例如decltype(f)声明后的类型auto f = [](int x) -> int {return x;};.你需要typedef的是decltype结果的东西来获得一个名字都没有.Traits类可用于确定返回类型,但它们很混乱,并且用户需要使用traits类重载来复制它们的所有函数重载; 对于诸如函数(通过指针的隐式转换)应用于给定基类的所有子类的情况,这很难正确执行.

  • 那么,这些"不可能"的类型只出现在C++ 0x中,而不是出现在C++ 03中吗? (3认同)
  • @Kirakun:嗯,不是真的,有**是C++ 03中的*匿名类型,但它们的频率要低得多. (2认同)