考慮下面的代碼:的C++ 0x decltype無法推斷成員變量,常量性
template <typename T>
class B
{
};
template <typename T>
B<T> f(T& t)
{
return B<T>();
}
class A
{
class C {};
C c;
public:
A() {}
decltype(f(c)) get_c() const { return f(c); }
};
int main()
{
A a;
a.get_c();
}
當我嘗試編譯,我得到的錯誤:
test.cpp: In member function 'B<A::C> A::get_c() const':
test.cpp:31:46: error: conversion from 'B<const A::C>' to non-scalar type 'B<A::C>' requested
看來,在編譯器不知道這是一個const成員函數,因此c
的類型爲const C
,因此錯誤地將f(c)
的類型推斷爲B<C>
,而不是B<const C>
,這實際上就是這樣。
我在做什麼不正確,還是這是一個編譯器錯誤?我使用gcc 4.6,但4.4和4.5顯示相同的行爲。
是的,它應該編譯。在未評估的上下文中,您可以訪問非靜態數據成員。 – 2011-02-08 21:32:21
@Johannes,我可能是錯的,但據我記得只有在函數體內允許訪問非靜態成員。如果上面的函數被修改爲使用尾隨返回類型,那麼您可以訪問非靜態成員。 – 2011-02-08 21:52:21
是的,我認爲你錯了。看到我的答案在這裏相關的問題:http://stackoverflow.com/questions/4849556/does-c0x-allow-decltype-in-function-signature/4850444#4850444 – TonyK 2011-02-08 21:59:58