问题标签 [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++11 - 关于 lambda 和 cin.get 的惊人价值
环境:vs2013 rc5 / vs2017;<br>项目:win32控制台应用;</p>
表示:编译运行一会儿,然后中断观察变量“task_”;
如果 func main 中的“add_task(&Test::print, &t, str, 10)”,则“task_”是正确的值;
但是如果 func mytest 中的“add_task(&Test::print, &t, str, 10)”,则“task_”的值是错误的;如果将 std::cin.get() 替换为 while(1){},则右转;
c++ - Visual Studio 中的 Lambda 模板变量错误?
c++14提供了变量模板,这些模板在visual-studio-2017中工作正常,但在 lambdas 中它们似乎分崩离析。例如:
在 gcc 6.3 上,此输出:
3.14159
在 Visual Studio 2017 上,此输出:
0.0
c++ - 变量模板中的除法在 Visual Studio 2017 中返回零
这可能是与此问题相关的visual-studio-2017错误: Templated Variables Bug With Lambdas in Visual Studio? 正如评论中提到的,似乎与优化器有关。
变量模板定义中的除法似乎在Visual Studio 2017中有一个错误。所以这个代码例如:
在 gcc 6.3 上,此输出:
0.0174533
在 Visual Studio 2017 上,此输出:
0.0
我假设这是另一个 Visual Studio 错误?这里有解决方法吗?
c++ - SFINAE 的可变参数模板专业化
我一直在尝试新的(ish)C++14 变量模板功能,并在编译期间遇到了这个奇怪的错误(g++ 6.3.0,但也使用 8.1.0 进行了测试)
还有比这更多的错误,但它们都是同一类。代码如下
似乎这里的问题是 SFINAE-style std::enable_if
,因为如果我删除它,这编译没有问题。config_data<Want*>
但奇怪的是,如果我删除with的每个实例config_data<Want*, Want>
(或其他一些Want
作为基础的类,我们也不会收到编译错误。
我的问题是,我怎样才能避免不得不
(a) 失去阻止此模板的用户传入随机类型作为模板参数的能力,或
(b) 要求在变量模板的每个实例化中使用不必要的基本参数。
我意识到在这个(人为的)例子中,(a)不是一个合理的问题。任何具有不实现其中一种特化的类型的模板实例化都将无法编译。但在一般情况下它肯定会是一个问题,它仍然没有解释为什么用一个有效的第一个参数、一个空的参数包和一个空白的默认参数来实例化模板会导致编译错误。
c++ - 非 constexpr 变量模板是否具有零开销?
我的意思是,当您实例化一个不是的模板变量时,究竟会生成什么constexpr
?
考虑一个计算阶乘的基本变量模板:
我的直觉是它会产生这样的东西:
我试图在C++ Insights上查看它,但生成的代码如下所示:
...这根本没有帮助。
我的下一个尝试是查看使用godbolt.org生成的(优化的)程序集,看看是否有任何区别:
令我惊讶的是,有!模板版本的组装行数大约是手写版本的两倍。GCC 似乎为每个实例化生成一个额外的“保护变量”。Clang 也这样做。
现在,考虑到零开销原则,这些变量应该做一些重要的事情。具体来说,我在编写“展开”版本时错过了一些东西。我想念的这个“东西”是什么?
PS:为了进一步伤害我的大脑,MSVC 采用了相反的方式,为模板版本生成的程序集实际上比没有模板的版本小 3 倍。不过,我无法从生成的程序集中理解很多,所以我把它排除在主要问题之外。
c++ - 变量模板的部分专业化
我知道我可以部分专门化类模板,并且我知道我不能部分指定函数模板。
变量模板呢?我找不到关于它们是否可以部分专业化的文档。
c++ - 即使从未实例化引用变量主模板,是否也需要对其进行初始化?
在 C++14 中声明一个引用模板而不初始化主引用模板是否合法,只要它从未实例化?
这会在 GCC 和 Clang 上产生不同的结果:
必须初始化主引用模板是没有意义的,因为在它被实例化之前,它是一个模板,而不是一个引用。
我发现我可以做类似的事情:
因为显然 GCC 和 Clang 都接受但忽略引用模板初始化程序 RHS,只要它是一个有效的表达式并且主引用模板永远不会被实例化。并且任何类型的任何表达式都满足 Clang 的初始化要求。
只要主引用模板从未实例化,GCC 就不需要初始化器。这似乎是“精神上”的正确行为,因为在实际实例化引用模板之前,它不应该需要初始化程序。
该标准在参考模板上并不是 100% 明确的。以下是我在变量模板实例化上能找到的一点点:
14.7.1
除非变量模板特化已被显式实例化或显式特化,否则变量模板特化在使用特化时被隐式实例化。
...
实现不应隐式实例化......一个不需要实例化的变量模板......。
14.7.2
除了内联函数、从其初始化程序或返回值 (7.1.6.4) 推导出的类型的声明、
const
文字类型的变量、引用类型的变量和类模板特化之外,显式实例化声明具有抑制实体的隐式实例化的效果他们所指的。[注意:目的是作为显式实例化声明主题的内联函数在使用odr(3.2)时仍将被隐式实例化,以便可以考虑将主体内联,但没有外联副本内联函数的一部分将在翻译单元中生成。—尾注]14.7.3
显式特化的函数模板、类模板或变量模板的声明应在显式特化的声明之前。[注意:需要声明,但不需要模板的定义。——尾注]。
编辑添加:
变量模板声明、类模板声明或函数模板声明分别与变量声明、类声明或函数声明不同,并且不受相同规则的约束。在模板被实例化之前,它只是一个模板。
类模板、变量模板和函数模板可以在不提供主要定义的情况下声明,仅提供专门化定义。以下代码在 Clang 和 GCC 上都是合法的:
那么,问题是为什么参考模板应该有所不同?为什么引用模板的主要声明必须是具有引用初始化的定义,而其他任何模板都不是这样?
c++ - 类模板中静态变量模板的部分特化
如果我进行部分专业化,我会从 clang 和 g++ 得到不同的结果。
我用 g++ 和 clang 编译并得到了不同的行为:
奖励:是否可以反过来专攻?