c++ - "typename qualified-id"引用非类型参数声明中的类型

标签 c++ language-lawyer

14.1 [temp.param], paragraph 2

... typename followed by an unqualified-id names a template type parameter. typename followed by a qualified-id denotes the type in a non-type parameter-declaration...

我对粗体文本的含义有点困惑。具体来说,typename 可以出现在两个不同的上下文中(类型说明符模板参数),但是 this 指的是哪一个呢?

  • 对于前一种情况,我考虑了:

    struct A {
        struct X { };
        int X;
    };
    struct B {
        struct X { };
    };
    template<class T> void f(T t) {
        typename T::X x;    // T can be A or B
    }
    

    但是,A::XB::X 都不是非类型参数声明(它们是成员声明)。

  • 对于后一种情况,我不确定为什么有必要。为什么不直接用qualified-id写下它的类型呢?是否需要参数化?

最佳答案

这是关于

struct S { typedef int X; };
template <typename T, typename T::X> void f() { }
int main() { f<S, 1>(); }

此处,typename T 表示 T 是命名模板类型参数,但 typename T::X 是未命名非命名类型-输入模板参数。

type-parameter 是用于模板类型参数的语法,parameter-declaration 是用于模板非类型参数的语法。

typename T 无法解析为参数声明中的类型名称说明符,因为它缺少嵌套名称-specifier,所以它必须是一个类型参数

typename T::X 无法解析为类型参数,因为它只允许在 typename 关键字后使用单个标识符,所以它必须是一个参数声明

我认为没有歧义,但文本阐明了这两个模板参数的解析方式有何不同。

关于c++ - "typename qualified-id"引用非类型参数声明中的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40440109/

相关文章:

c++ - NS3 : how to setup RcvBufSize for each TCP session?

c++ - 从 'ClassType<std::unique_ptr<Base>>' 创建 'std::unique_ptr<Derived>' 时出现 (/permissive-) 的编译错误

c++ - 模板函数重载的实例化

c++ - 实例化模板时,其不完整参数类型的成员是否应该可见?

c++ - 理解继承的嵌套类模板的偏特化

c - 增量运算符和 "undefined behaviour"

c++ - C++ 中 omp_get_wtime() 的解析

c++ - Visual Studio 2010 中新 ATL 项目的资源 ID 差距

c++ - 是否允许在一个翻译单元中使用显式返回类型并在另一个翻译单元中使用推导返回类型?

c++ - 即使 nm 报告存在符号,运行时也会出现符号查找错误