C++ 0x decltype无法推导出成员变量constness

HC4*_*ica 4 c++ const decltype c++11

请考虑以下代码:

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();
}
Run Code Online (Sandbox Code Playgroud)

当我尝试编译它时,我收到错误:

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
Run Code Online (Sandbox Code Playgroud)

它似乎在decltype,和编译器不知道这是一个const成员函数,因此c是类型的const C,并因此推断不正确的类型,f(c)B<C>不是B<const C>这是它到底是什么.

我做错了什么,或者这是编译错误?我使用gcc 4.6,但4.4和4.5表现出相同的行为.

Joh*_*itb 7

编译器根据当前的C++ 0x WP正确运行.请参阅此问题报告,该报告目前正在进行中.

可能最终的C++ 0x Standard不会decltype在函数名称之前的返回类型中更改应用程序的含义.你需要将它移动到参数列表之后使用-> decltype(f(c)),希望在最终的C++ 0x中做正确的事情.