函数返回类型中的g ++ auto和typename关键字

时间:2014-01-05 22:04:40

标签: c++ templates c++11 g++ c++14

以下列方式using SFINAE with functions/function members时:

#include <type_traits>
#include <iostream>

#include <cstdlib>

struct X {};

struct A
{

    template< typename T >
    auto
    f(T && x)
    -> std::enable_if< std::is_same< T, X >::value >::type
    {
        return x;
    }

};

int main()
{ 
    return EXIT_SUCCESS;
}

我收到错误:

main.cpp:14:8: error: expected type-specifier
     -> std::enable_if< std::is_same< T, X >::value >::type
        ^
main.cpp:14:8: error: expected initializer

因此我应该在typename关键字前面加上启用码。但这里没有任何含糊之处:因为我现在只在->之后输入预期。另一个值得思考的提示是 Qt Creator 在这种情况下typename关键字的不足。

这是 G ++ 错误吗?或者在C ++ 11中声称有typename这样的上下文?

2 个答案:

答案 0 :(得分:6)

每次访问依赖类型名称(嵌套在依赖于模板参数的表达式中的类型名称)时,都需要使用typename关键字。在这种情况下,我很确定你是对的,没有歧义,但如果我没记错,这就是语言的定义方式。

希望这有帮助!

答案 1 :(得分:5)

  

但这里根本没有歧义:因为我现在只在 - &gt;

之后键入预期

这不是真的如何运作。

同样,在以下声明中只需要一种类型:

T::some_member x;

但是typename依赖时仍然需要T,以满足某些编译阶段。

编译器知道这是一个声明(在决定它是否有效之前),直到它看到你有一个->后跟一个类型。因此,如果它不知道你有一个类型,它不知道“没有歧义”。这是一个鸡蛋问题。