c++ - 声明模板成员函数返回类型

标签 c++ typetraits

我有一个简单的特征函数:

template <typename Traits>
struct Cal {
    typedef typename Traits::T T;
    static T f(T a, T b);
};

struct FTraits {
    typedef float T;
};
struct DTraits {
    typedef double T;
};

我可以想到 4 种方法来实现 Cal::f 并指定返回类型。

// option 1. compile. as inline implementation
template <typename Traits>
struct Cal {
    typedef typename Traits::T T;
    static T f(T a, T b) {
        return a+b;
    }
};
// option 2. compile
template <typename Traits>
typename Traits::T Cal<Traits>::f(T a, T b) {
    return a+b;
};
// option 3. does not compile
template <typename Traits>
T Cal<Traits>::f(T a, T b) {
    return a+b;
};
// option 4. compile
template <typename Traits>
auto Cal<Traits>::f(T a, T b) -> T {
    return a+b;
};

我相信选项 4 是在 c++11 中添加的,因为选项 3 在以前的标准中是不可能的。我的问题是,为什么选项 3 不起作用?具体来说,我想知道返回类型 T 不能命名类型,而参数类型 T 可以命名类型的原因。编译器是否在返回和参数类型的不同上下文中工作?另外,为什么 c++11 选择选项 4 而不是选项 3?似乎选项 3 比选项 4 更直观。

最佳答案

即使像 C++ 这样复杂的语言的编译器仍然需要从头到尾处理文件。

如果声明在template< … >之后以 T 开头, 编译器需要知道什么 T是,以便在继续查找声明的其余部分之前解析它并确定它是一个返回类型。

本质上,限定符 Cal< Traits >::需要在语法上出现在对 Cal 成员的任何不合格使用之前.使用尾随返回类型扩展语言要容易得多,这会放置 Cal< Traits >::auto 之后立即,而不是创建一种启发式方法来跳过具有未知标识符的类型名称。

关于c++ - 声明模板成员函数返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32062921/

相关文章:

c++ - 有没有办法将一个文件包含到 C++ 中的所有项目文件中?

c++ - boost::posix_time::ptime 中的特定时区

c++ - SDL_TTF 渲染错误的地方

c++ - 潜在的安全漏洞是什么? C++

python - 使用 SWIG 包装共享指针对象不授予对类成员函数的访问权限

c++ - 为什么编译器不帮助我们处理类型特征,而是求助于语言怪癖?

c++ - 我们可以在 C++17 中检测到 "trivial relocatability"吗?

C++11 type_traits : same type if floating point, double 如果是整型

c++ - 如何确定类型是否为 memcpy-save?

c++ - 有没有办法仅通过名称来检测重载的成员函数? (不检测名称)