问题标签 [variable-templates]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 类型到值元函数可以用作 C++14 中的变量别名吗?
在查看 C++14 元函数别名提案(TransformationTraits Redux, v2,N3655)时,我注意到,不仅类型到类型的转换(例如add_const
),类型到值的元函数(例如is_void
)也是类型别名。(在N3797中不存在)。
别名类型对值元函数有什么好处吗?我认为,可以在没有这些别名的情况下使用它们,例如enable_if_t<is_void<T>::value,T>
或者enable_if_t<is_void<T>{}(),T>
当存在转换操作时。(我猜is_void<T>::type::value
是一样的is_void<T>::value
)
如果值元函数的类型需要是别名,将它们别名为变量模板会更好吗(我没有 C++14 编译器并且从未使用过变量模板。所以语法可能是错误的)?例如别名is_void
为
代替
这样就可以enable_if_t<is_void_t<T>,T>
不用boost风格写了enable_if
,写表达会更容易(egenable_if_t<(is_void_t<T> || is_integral_t<T>),T>
c++ - 我可以使用一个变量模板来声明另一个变量模板吗?
随着 C++14 中的变量模板(并且 Clang 已经支持它们)以及标准is_same_v
和类似类型特征的提议,我认为能够按如下方式制作新的类型特征会很整洁:
唉,这会导致相当于以下 SSCCE 的错误(这个包含下面提到的所有内容):
随着main
注释行,Clang 吐出以下内容:
警告:变量
is_pointer<type-parameter-0-0>
具有内部链接但未定义
它看起来对我来说是定义的(请注意,更改T
为int *
infoo
可以正常工作)。取消注释main
以实例化的行foo
给出了这个(再次,T
工作int *
正常):
错误:constexpr 变量
foo<int *>
必须由常量表达式初始化
但是,替换foo
为以下旧语法会导致两个实例都可以正常工作:
关于变量模板,我有什么遗漏吗?有没有办法用它们构建新的变量模板,或者我是否被迫使用旧语法来构建新的,并且只在将它们用于其他代码时才享受语法糖?
c++ - Clang 自动变量模板错误
我去看看你是否可以在变量模板声明中使用 auto 。
很好,但是一旦您尝试使用它,就会发出叮当声。
,的任何组合都decltype(auto)
不起作用,auto
即使它说这auto
是一个左值。
我以前从未见过自动以这种方式行事。是因为模板变量还是因为clang如何对待auto?
c++ - 递归变量模板
我试图像使用其他模板一样使用变量模板,例如:我们已经知道如何使用包含静态值或枚举值的模板对象的元编程来计算斐波那契数或数字的幂。
所以,我做的第一件事是尝试专门化一个模板变量,它按预期工作:
知道变量模板专业化是可能的,我尝试做一个变量模板斐波那契数:
我从Wandbox得到的错误如下:
我不知道我做错了什么,也不理解错误。我猜测该错误可能与变量模板尚未定义这一事实有关,而我已经在使用它,所以我想知道是否有可能使用变量模板实现我的目标。
有什么提示吗?
非常感谢。
c++11 - 模板变量是线程安全的吗?它们被放置在数据段上?
我正在使用 C++14 中的新模板变量功能以适应它(也许很快就会这样做,因为似乎某些编译器没有完全实现它)。
现在我想知道模板变量的每个实例在哪里。在我到目前为止所做的测试中,它们似乎在任何静态数据之前被初始化,所以我想知道它们是否被放置在程序的数据段中。让我们看看到目前为止我已经尝试过什么,我有一个类可以打印有关构造和破坏的信息:
squealer
还有一个在本地存储、静态存储和模板变量中实例化一些s 的程序,这是该程序:
这是程序,这是输出:
正如我们所看到的,所有模板变量squealer
实例都是在命名的之前创建的"static"
,最后(如预期的那样)命名local
的被创建,销毁顺序是相反的(如预期的那样),所以:创建/初始化的顺序模板变量实例的数量与其在代码上的外观相同,无论此外观的位置如何,也无论它们是否被使用(f()
从不调用该函数)。
那么第一个问题是,这个模板变量是放在数据段上的吗?我不知道如何测试或检查它。
第二个问题是,所有这些模板变量squealer
实例都是线程安全的吗?我在n3376 §6.7上阅读了以下句子(强调我的):
允许实现在与允许实现在命名空间范围(3.6.2)中静态初始化具有静态或线程存储持续时间的变量相同的条件下,对具有静态或线程存储持续时间的其他块范围变量执行早期初始化。否则,此类变量在控件第一次通过其声明时被初始化;这样的变量在其初始化完成时被认为已初始化。如果初始化抛出异常退出,说明初始化未完成,下次控件进入声明时会再次尝试。如果控制在变量初始化的同时进入声明,并发执行将等待初始化完成.
从 C++11 开始,如果所有模板变量squealer
实例都在静态存储中,它们应该是线程安全的,不是吗?
谢谢。
c++ - C++14 警告:变量的模板头太多(应为 0)
在试验最近的 g++-5 编译器时,我在一个文件中写了以下语句:
结果是:
警告:太多的模板标题
a
(应该是 0)
同样有效的是,它并没有真正专业化a<int>
。例如
这种语法有什么奥秘?
c++ - 转发非类型参数会导致变量模板的不同行为
这似乎是另一个“谁做得好?” 问题因为 gcc 6.0.0 和 clang 3.7.0 的行为不同。
假设我们有一个变量模板,它接受一个const char *
作为非模板参数并专门用于给定指针:
请注意,模板变量具有不同的类型,具体取决于专业化。十我们有两个模板函数,每个都接受一个const char *
非模板参数并将其转发给变量模板:
然后,调用此函数会导致不同的行为:
clang 3.7.0 打印FOO
并且void Struct::function() const
(正如我所料)而 gcc 6.0.0 无法编译并出现以下错误:
请求'Value'中的成员'function',它是非类类型'char [8]'
我几乎可以肯定 gcc 未能将模板非类型参数转发NAME
给函数中的变量模板Value
,call_function
因此它选择了非专用变量模板,该模板是具有'char [8]'
类型的...
它的行为就像是在复制模板参数。这仅在调用对象的成员函数时发生,如果我们注释 的主体call_function
,则输出FOO
不是UNKNOWN
,因此在print
函数中转发即使在 gcc 中也可以工作。
所以
- 什么是正确的行为?(mi 赌注是为了铿锵声)
- 我怎样才能为做错的编译器打开错误票?
c++ - c++14中的变量模板偏特化和别名
我正在尝试将以下位掩码数组转换为更紧凑的版本。
这是我所拥有的...
我想进一步简化客户端代码,这样他们就不必写出 std::make_index_sequence。我怎样才能做到这一点?我无法正确使用语法,也不确定这是否可行。
那不编译。length_mask 的声明/定义应该是什么?