请考虑以下代码:
struct test {
auto func() -> decltype(data) {} // ERROR
int data;
};
int main() {
test t;
t.func();
}
Run Code Online (Sandbox Code Playgroud)
它给出以下错误:
main.cpp:2:29: error: 'data' was not declared in this scope
auto func() -> decltype(data) {}
Run Code Online (Sandbox Code Playgroud)
但是,如果我放在data上面func(),它没有错误(实时代码):
struct test {
int data;
auto func() -> decltype(data) {}
};
...
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,为什么decltype不考虑在它之后声明的成员(何时decltype用于方法声明,而不是在定义中)?我还想知道在将来的语言标准迭代中这种行为是否有任何变化.
decltype表现得与众不同.我的编码约定是将类数据成员放在类函数下面.当然,这种不同的行为会影响我组织班级成员的方式.如果您能提供可以保留我的编码约定的任何解决方法,我将非常感激. 首先,我构造了四个结构,每个结构返回值,l值引用,const l值引用,r值引用.我使用他们的包装(B或C),在方法func()的包装的,我想保持引用和CV预选赛func()的 A.
在c ++ 11中,我使用了尾随返回类型.但是随着c ++ 14中普通返回类型推导的到来,我猜我可以跳过尾随部分,但只有auto,返回类型忽略限定符和引用就像普通的一样auto.
那么,我的问题是在c ++ 14中实现它的最佳方法是什么,它的行为就像B下面的类一样?当它是微不足道的时候写尾随部分(通常是decltype(返回表达式))有时是令人沮丧的.
struct A1 {
int func(){
return x;
}
int x{3};
};
struct A2 {
int& func(){
return x;
}
int x{3};
};
struct A3 {
const int& func(){
return x;
}
int x{3};
};
struct A4 {
int&& func(){
return std::move(x);
}
int x{3};
};
template <class A>
struct B{
auto func() -> decltype(std::declval<A>().func()) …Run Code Online (Sandbox Code Playgroud)