【发布时间】:2018-08-20 11:59:51
【问题描述】:
以下情况:
#include <stdint.h>
class C
{
public:
C()=default;
~C()=default;
template<uint8_t> struct integconst
{
};
int m1(integconst<8>);
int m2(integconst<8>);
decltype(auto) masterMethod(int opMode);
private:
};
int C::m1(integconst<8>) {return 1;}
int C::m2(integconst<8>) {return 2;}
decltype(auto) C::masterMethod(int opMode)
{
switch(opMode)
{
case 1:
return m1(integconst<sizeof(uintptr_t)>{}); break;
case 2:
return m2(integconst<sizeof(uintptr_t)>{}); break;
default:
return m1(integconst<sizeof(uintptr_t)>{}); break;
}
}
int main()
{
C obj;
int bla=obj.masterMethod(1);
return 0;
}
上面的简化示例将毫无问题地工作。但是当我尝试在单独的文件(full example here)中分离实现和声明时,我得到了错误
main.cpp: error: use of 'decltype(auto) C::masterMethod(int)' before deduction of 'auto'。将实现直接移动到类本身可以解决问题(或在同一个文件中实现方法),但我真的不明白为什么?有人可以解释一下为什么编译器还不知道 decltype(auto) 的类型,特别是编译器什么时候开始解析“auto”的返回类型?我想如何将实现和声明分开?
【问题讨论】:
-
编译器需要定义函数来推断类型
-
@Tyker 但定义已经在 *.cpp 文件中?
-
想象一下,您将这样的标头(没有此类方法的定义)包含到不同的 .cpp 文件中,该文件具有调用它的方法(如完整示例中的情况,您显示)。编译器应该如何决定
auto在其他不包含定义的 .cpp 文件中应该解析为什么? -
c++ 按翻译单元工作;并且彼此看不到其他人的内容。
标签: c++ c++14 auto decltype type-deduction