【问题标题】:g++ auto and typename keywords in function return type函数返回类型中的 g++ auto 和 typename 关键字
【发布时间】:2014-01-05 22:04:39
【问题描述】:

当我以下列方式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 关键字。但这里完全没有歧义:因为我现在只在-&gt; 之后输入预期的内容。另一个提示是 Qt Creator's 在这种情况下 typename 关键字的基础。

这是 G++ 错误吗?还是在 C++11 中针对此类上下文声明 typename

【问题讨论】:

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


【解决方案1】:

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

希望这会有所帮助!

【讨论】:

  • 一个基类说明符作为一个例外,那里不需要typename
【解决方案2】:

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

之后键入预期

实际情况并非如此。

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

T::some_member x;

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

编译器不知道这是一个声明(在决定它是否有效之前),直到它可以看到你有一个-&gt;,然后是一个类型时间>。所以如果它不知道你有一个类型,它就不知道有“没有歧义”。这是一个先有鸡还是先有蛋的问题。

【讨论】:

    猜你喜欢
    • 2015-12-24
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-24
    • 2020-04-22
    • 1970-01-01
    相关资源
    最近更新 更多