【发布时间】:2012-01-26 13:03:27
【问题描述】:
在我给出的这个answer 中,使用this 和在尾随返回类型中的_arg 类的属性作为decltype 表达式的一部分是有意义的。可以不用,但不方便。
clang 3.0(见下文)和gcc 4.5.2 都没有接受它。
#include <iostream>
class MyClass {
public:
MyClass(int i): _arg(i) {}
template <typename F>
auto apply(F& f) -> decltype(f(_arg)) {
return f(_arg);
}
template <typename F>
auto apply(F& f) -> decltype(f(*this, _arg)) {
return f(*this, _arg);
}
private:
int _arg;
};
struct Id {
template <typename V>
V operator()(V v) const { return v; }
};
struct ComplexId {
template <typename C, typename V>
V operator()(C const&, V v) { return v + 1; }
};
int main() {
Id id; ComplexId complex;
MyClass c(0);
std::cout << c.apply(id) << " " << c.apply(complex) << "\n";
}
clang 3.0 说:
$ clang++ -std=c++11 -Weverything test.cpp
test.cpp:8:38: error: use of undeclared identifier '_arg'
auto apply(F& f) -> decltype(f(_arg)) {
^
test.cpp:8:45: error: type name requires a specifier or qualifier
auto apply(F& f) -> decltype(f(_arg)) {
^
test.cpp:8:45: error: C++ requires a type specifier for all declarations
auto apply(F& f) -> decltype(f(_arg)) {
~~~~~~~~ ^
test.cpp:8:7: error: 'auto' return without trailing return type
auto apply(F& f) -> decltype(f(_arg)) {
^
test.cpp:13:39: error: invalid use of 'this' outside of a nonstatic member function
auto apply(F& f) -> decltype(f(*this, _arg)) {
^
test.cpp:13:52: error: type name requires a specifier or qualifier
auto apply(F& f) -> decltype(f(*this, _arg)) {
^
test.cpp:13:52: error: C++ requires a type specifier for all declarations
auto apply(F& f) -> decltype(f(*this, _arg)) {
~~~~~~~~ ^
test.cpp:13:7: error: 'auto' return without trailing return type
auto apply(F& f) -> decltype(f(*this, _arg)) {
^
8 errors generated.
嗯...不太好。
但是,在大多数编译器中,对 C++11 的支持充其量只是 hacky,我找不到标准 (n3290) 中提到的具体限制。
在 cmets 中,Xeo 表示这可能是标准中的一个缺陷......
那么,这是否允许?
奖励:clang / gcc 的最新版本是否支持此功能?
【问题讨论】:
-
Clang 3.1 HEAD 发出同样的错误。
-
顺便说一句,我刚刚找到this interesting, similar question。此外,根据@Johannes 建议预先声明成员,我只会在尾随返回类型中收到关于
this的错误,而不再使用 Clang 3.1 HEAD 收到关于_arg的错误。 -
@Xeo:是的,我见过这个问题,但它更多的是关于 const-ness 而不是
this。我没有测试过 Johannes 的建议,很高兴知道它减少了编译器产生的错误数量。
标签: c++ c++11 trailing-return-type