函数返回值的decltype

10
我正在制作一个模板类,它是任何迭代器的包装器。我将通过以下方式实现operator*:
template <typename T>
class MyIterator {
public:
    //...
    decltype(*T()) operator*() {
    //...
    }
}

我给类T的operator*函数传递了一个decltype调用,它甚至能够工作,但是如果T没有默认构造函数,则无法正常工作。

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

1个回答

17
这就是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 是一个迭代器类型,您也可以使用无需任何 C++0x 支持的 std::iterator_traits 模板:

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

我的编译器显示“不得使用declval()!” - André Puel
1
你的编译器到底报了什么错误(你用的是哪个编译器)?你不能_ODR-use_declval,因为它没有被定义;你只能在不会被求值的上下文中使用它,例如在decltype中。 - James McNellis
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.1/../../../../include/c++/4.6.1/type_traits:1134:7: 错误:静态断言失败:“不得使用declval()!” - André Puel
请将以下与程序相关的内容从英语翻译成中文。只返回翻译后的文本:http://pastebin.com/LrACx9UB,它包含了使用boost unittest框架的一个测试用例。 - André Puel
1
你的代码在gcc 4.7下编译通过了,没有触发静态断言。 - Vitus
1
在GCC 4.6.1中也可以编译成功(记得加上“-std=c++0x”)。 - Kerrek SB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接