【问题标题】:Decltype for return of a function用于返回函数的 Decltype
【发布时间】:2011-07-26 22:35:49
【问题描述】:

我正在制作一个模板类,它是任何迭代器的包装器。我正在以这种方式制作运算符*:

template <typename T>
class MyIterator {
public:
    //...
    decltype(*T()) operator*() {
    //...
    }
}

我给了 decltype 一个对 T 类的 operator* 的调用,它甚至可以工作,但是如果 T 没有默认构造函数,它就不会工作。

有没有办法找出函数/方法的返回类型?

【问题讨论】:

    标签: c++ templates c++11 decltype


    【解决方案1】:

    这就是std::declval 的用途:

    decltype(*std::declval<T>()) operator*() { /* ... */ }
    

    如果你的实现没有提供std::declval(Visual C++ 2010 不包含),你可以自己轻松编写:

    template <typename T>
    typename std::add_rvalue_reference<T>::type declval(); // no definition required
    

    由于T是一个迭代器类型,你也可以使用std::iterator_traits模板,它不需要任何C++0x支持:

    typename std::iterator_traits<T>::reference operator*() { /* ... */ }
    

    【讨论】:

    • 我的编译器说“不能使用declval()!”
    • 您的编译器到底说了什么(以及您使用的是什么编译器?)您不能 ODR 使用 declval,因为它没有定义;您只能在不会对其进行评估的情况下“使用”它,例如在decltype.
    • /usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.1/../../../../include/c++/4.6.1/type_traits:1134 :7: 错误:静态断言失败:“不得使用 declval()!”
    • 您的代码使用 gcc 4.7 编译得很好。没有静态断言失败。
    • 在 GCC 4.6.1 中也可以正常编译(记住 -std=c++0x)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    • 1970-01-01
    相关资源
    最近更新 更多