【问题标题】:C++14 variable template with default template parameter?具有默认模板参数的 C++14 变量模板?
【发布时间】:2013-11-11 17:04:57
【问题描述】:

C++14 将允许变量模板:

template <typename T> constexpr T pi = T(3.1415926535897932385);

现在考虑以下情况:

template <typename T = double> constexpr T pi = T(3.1415926535897932385);

问题:如何使用默认参数获取pi

pi; // Option 1 (I hope...)
pi<>; // Option 2

【问题讨论】:

  • 我会假设选项 2,因为这就是老式模板的工作方式。但我还没有详细了解 C++14。
  • 函数模板需要避免&lt;&gt;的原因是,您可以从包含模板和非模板的重载集中进行选择,例如void foo(int); template&lt;class T&gt; void foo(T); foo(2.5); 类和变量模板都不需要它——这并不意味着它不会被允许。查看当前草案(github repo 8e1913d3),看来必须使用选项 2。
  • 和最新实现的clang仅编译选项2。它说1是不允许的。

标签: c++ templates variables c++14


【解决方案1】:

基于n3651 我会说pi&lt;&gt;;。在目前的标准模板参数推导中,能够做到pi是一种形式,只适用于函数。由于该论文完全没有提及 TAD,因此他们不太可能使用它。

【讨论】:

  • TAD 代表什么?
  • @Hector 模板参数推导
【解决方案2】:

根据this 草稿,用法将是pi&lt;TYPE&gt;,但这可能会及时改变。仅使用pi,编译器可能无法推断出pi 的类型,就像编写这样的函数:template &lt;class T&gt; void foo(); 并像这样使用:foo()

对于默认参数,它的行为应该像一个函数,所以它应该是pi;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-04
    • 1970-01-01
    • 2018-10-12
    • 2019-09-12
    • 1970-01-01
    • 2015-05-09
    • 2011-10-01
    相关资源
    最近更新 更多