问题标签 [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.

0 投票
1 回答
569 浏览

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>

0 投票
2 回答
405 浏览

c++ - 我可以使用一个变量模板来声明另一个变量模板吗?

随着 C++14 中的变量模板(并且 Clang 已经支持它们)以及标准is_same_v和类似类型特征的提议,我认为能够按如下方式制作新的类型特征会很整洁:

唉,这会导致相当于以下 SSCCE 的错误(这个包含下面提到的所有内容):

随着main注释行,Clang 吐出以下内容:

警告:变量is_pointer<type-parameter-0-0>具有内部链接但未定义

它看起来对我来说是定义的(请注意,更改Tint *infoo可以正常工作)。取消注释main以实例化的行foo给出了这个(再次,T工作int *正常):

错误:constexpr 变量foo<int *>必须由常量表达式初始化

但是,替换foo为以下旧语法会导致两个实例都可以正常工作:

关于变量模板,我有什么遗漏吗?有没有办法它们构建新的变量模板,或者我是否被迫使用旧语法来构建新的,并且只在将它们用于其他代码时才享受语法糖?

0 投票
2 回答
2158 浏览

c++ - 类范围内的变量模板

N3651为基础,

类范围的变量模板是静态数据成员模板

给出的例子是:

然而,以下所有定义都给出了错误:

是什么赋予了?

0 投票
1 回答
265 浏览

c++ - Clang 自动变量模板错误

我去看看你是否可以在变量模板声明中使用 auto 。

很好,但是一旦您尝试使用它,就会发出叮当声。

,的任何组合都decltype(auto)不起作用,auto即使它说这auto是一个左值。

我以前从未见过自动以这种方式行事。是因为模板变量还是因为clang如何对待auto?

0 投票
1 回答
418 浏览

c++ - 递归变量模板

我试图像使用其他模板一样使用变量模板,例如:我们已经知道如何使用包含静态值或枚举值的模板对象的元编程来计算斐波那契数或数字的

所以,我做的第一件事是尝试专门化一个模板变量,它按预期工作:

知道变量模板专业化是可能的,我尝试做一个变量模板斐波那契数:

我从Wandbox得到的错误如下:

我不知道我做错了什么,也不理解错误。我猜测该错误可能与变量模板尚未定义这一事实有关,而我已经在使用它,所以我想知道是否有可能使用变量模板实现我的目标。

有什么提示吗?

非常感谢。

0 投票
2 回答
275 浏览

c++11 - 模板变量是线程安全的吗?它们被放置在数据段上?

我正在使用 C++14 中的新模板变量功能以适应它(也许很快就会这样做,因为似乎某些编译器没有完全实现它)。

现在我想知道模板变量的每个实例在哪里。在我到目前为止所做的测试中,它们似乎在任何静态数据之前被初始化,所以我想知道它们是否被放置在程序的数据段中。让我们看看到目前为止我已经尝试过什么,我有一个类可以打印有关构造和破坏的信息:

squealer还有一个在本地存储、静态存储和模板变量中实例化一些s 的程序,这是该程序:

这是程序,这是输出:

正如我们所看到的,所有模板变量squealer实例都是在命名的之前创建的"static",最后(如预期的那样)命名local的被创建,销毁顺序是相反的(如预期的那样),所以:创建/初始化的顺序模板变量实例的数量与其在代码上的外观相同,无论此外观的位置如何,也无论它们是否被使用(f()从不调用该函数)。

那么第一个问题是,这个模板变量是放在数据段上的吗?我不知道如何测试或检查它。

第二个问题是,所有这些模板变量squealer实例都是线程安全的吗?我在n3376 §6.7上阅读了以下句子(强调我的):

允许实现在与允许实现在命名空间范围(3.6.2)中静态初始化具有静态或线程存储持续时间的变量相同的条件下,对具有静态或线程存储持续时间的其他块范围变量执行早期初始化。否则,此类变量在控件第一次通过其声明时被初始化;这样的变量在其初始化完成时被认为已初始化。如果初始化抛出异常退出,说明初始化未完成,下次控件进入声明时会再次尝试。如果控制在变量初始化的同时进入声明,并发执行将等待初始化完成.

从 C++11 开始,如果所有模板变量squealer实例都在静态存储中,它们应该是线程安全的,不是吗?

谢谢。

0 投票
1 回答
1249 浏览

c++ - C++14 警告:变量的模板头太多(应为 0)

在试验最近的 g++-5 编译器时,我在一个文件中写了以下语句:

结果是:

警告:太多的模板标题a(应该是 0)

同样有效的是,它并没有真正专业化a<int>。例如

这种语法有什么奥秘?

0 投票
2 回答
237 浏览

c++ - 转发非类型参数会导致变量模板的不同行为

这似乎是另一个“谁做得好?” 问题因为 gcc 6.0.0 和 clang 3.7.0 的行为不同。

假设我们有一个变量模板,它接受一个const char *作为非模板参数并专门用于给定指针:

请注意,模板变量具有不同的类型,具体取决于专业化。十我们有两个模板函数,每个都接受一个const char *非模板参数并将其转发给变量模板:

然后,调用此函数会导致不同的行为:

Code Here

clang 3.7.0 打印FOO并且void Struct::function() const(正如我所料)而 gcc 6.0.0 无法编译并出现以下错误:

请求'Value'中的成员'function',它是非类类型'char [8]'

我几乎可以肯定 gcc 未能将模板非类型参数转发NAME给函数中的变量模板Valuecall_function因此它选择了非专用变量模板,该模板是具有'char [8]'类型的...

它的行为就像是在复制模板参数。这仅在调用对象的成员函数时发生,如果我们注释 的主体call_function,则输出FOO不是UNKNOWN,因此在print函数中转发即使在 gcc 中也可以工作。

所以

  • 什么是正确的行为?(mi 赌注是为了铿锵声)
  • 我怎样才能为做错的编译器打开错误票?
0 投票
0 回答
172 浏览

c++ - c++14中的变量模板偏特化和别名

我正在尝试将以下位掩码数组转换为更紧凑的版本。

这是我所拥有的...

我想进一步简化客户端代码,这样他们就不必写出 std::make_index_sequence。我怎样才能做到这一点?我无法正确使用语法,也不确定这是否可行。

那不编译。length_mask 的声明/定义应该是什么?

0 投票
2 回答
944 浏览

c++ - 模板类中的变量模板 - 意外错误(可能的错误?)

有:


(0) ideone

  • 不使用 clang++ 3.6 编译。

    错误:不能在没有模板参数列表的情况下引用变量模板“值”

  • 不使用 g++ 5.2 编译。

    错误:'template constexpr const T Value::value' 不是函数模板


(1) ideone

使用 clang++ 和 g++ 编译。


为什么(0)无法编译?

如果通过模板参数(在本例中为 )访问变量模板,似乎会出现问题TValue。为关键字定义类型别名TValue或使用typename关键字并不能解决问题。

这里发生了什么?