gpt4 book ai didi

c++ - 简单类型说明符是模板参数

转载 作者:行者123 更新时间:2023-11-30 05:07:38 25 4
gpt4 key购买 nike

根据 ISO 14882:2011 § 14.6.2.1:

A type is dependent if it is — a template parameter,

并且根据 § ISO 14882:2011 14.6:

A name used in a template declaration or definition and that is dependent on a template-parameter is assumed not to name a type unless the applicable name lookup finds a type name or the name is qualified by the keyword typename.

但是

template <typename T> class U
{
typename T t; // ill-formed, i have an compilier error
};

“从属名称”和“在模板声明或定义中使用并依赖于模板参数的名称”是同一个概念吗?我试图解决我的误解,因为它看起来像是标准断言(ISO 14882:2011 § 14.6.2.1)与标准 T t; 中的示例之间的冲突。

最佳答案

您的示例代码格式错误,因为 ISO 部分 17.7.3 ( http://eel.is/c++draft/temp.res#3 ): T不是 nested name-specifier .

因此,没有办法T可以是除 typename T 之外的任何内容用作模板参数。 IE。编译器不会出错,所以你不需要用 typename-specifier 来限定它.

依赖类型的示例,其中 typename-specifier需要的是 T::value_type ,因为 value_type 的实际类型/值取决于 T是。在这种情况下,您必须帮助编译器:

template <typename T> class U {
using t = T; // OK
using u = T::value_type; // ill-formed: needs typename-specifier
using v = typename t::value_type; // OK: qualified with typename keyword
};

假设您有以下内容:

class foo {
constexpr static int value_type = 7;
}

class bar {
using value_type = int;
}

这就是上面第二行 typedef 格式错误的原因:if Tfoo然后value_type实际上不是一个类型,而是一个名字很容易混淆的常量。如果Tbar那么一切都很好。但是编译器不可能知道这些,所以你得帮他,让他放心value_type实际上是一种类型。这也意味着如果您尝试编译 U<foo>,您将遇到编译错误。 .

注意:我对 typedef 使用了 C++11 语法,因为我发现它更具可读性。如果您使用 typedef,上面的解释仍然有效而不是 using .

关于c++ - 简单类型说明符是模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47312983/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com