可以将`nullopt`作为非类型模板参数传递吗?

考虑下面的代码示例

#include <iostream>
#include <experimental/optional>

std::experimental::optional<int> dflt(42);

template<const std::experimental::optional<int>& Dflt>
void foo() {
    if (Dflt) {
        std::cout << "default is set" << std::endl;
    } else {
        std::cout << "default is not set" << std::endl;
    }
}

int main() {
        foo<dflt>();                       // <-- OK
        foo<std::experimental::nullopt>(); // <-- NOT OK
}

我试图实现的是nullopt作为非类型函数模板参数传递,但它没有编译。它可以与dflt带有静态存储的全局变量一起使用。

编译器错误消息如下所示:

foo.cc: In function ‘int main()’:
foo.cc:13:34: error: no matching function for call to ‘foo()’
  foo<std::experimental::nullopt>();
                                  ^
foo.cc:7:6: note: candidate: template<const std::experimental::fundamentals_v1::optional<int>& Dflt> void foo()
 void foo() {
      ^
foo.cc:7:6: note:   template argument deduction/substitution failed:
foo.cc:13:34: error: could not convert template argument ‘std::experimental::fundamentals_v1::nullopt’ to ‘const std::experimental::fundamentals_v1::optional<int>&’
  foo<std::experimental::nullopt>();

我知道这个例子很愚蠢,但是我的主要问题是,可以nullopt作为非类型模板参数来传递吗?

讲故事的人-Unslander Monica

不是您尝试通过的方式。

更长的答案与模板参数上的约束有关。您的模板参数是引用类型。它的相应参数必须满足[temp.arg.nontype] / 2(强调我的要求)中的要求

非类型模板参数的模板参数应为模板参数类型的转换常量表达式。对于引用或指针类型的非类型模板参数,常量表达式的值不得引用(或对于指针类型,不得为以下地址):

  • 一个子对象
  • 临时物体
  • 字符串文字,
  • Typeid表达式的结果,或者
  • 预定义的 func__变量。

nullopt是类型的常量nullopt_t这显然不是一个optional<int>因此,要绑定该const引用,我们将需要实现一个临时实例。但这显然使程序格式错误,如黑体字所示。


不过请注意,您可以让参数成为对的引用nullopt_t然后,您可以传递nullopt参数。我会说,尽管这样的模板的用途是有限的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将函数指针作为非类型模板参数传递

非类型模板参数中的占位符类型可以涉及作为模板参数传递的函数的重载解析吗?

我可以将引用类型传递给模板以指定以下非类型模板参数的类型吗?

是否可以将指针作为非类型模板参数中的整数类型?

在将指针作为非类型模板参数传递给数据成员时,推断类型和类

是否可以使用不同的枚举类型作为非类型模板参数

Constexpr值作为指针类型的非类型模板参数

非类型模板参数

std :: source_location作为非类型模板参数

使用数组元素作为非类型模板参数?

引用作为非类型模板参数

C++ struct 静态成员变量可以隐藏非类型模板参数吗?

可以使用自动占位符来推断非类型模板参数的函数结果吗?

c ++ 17中的非类型模板参数可以是decltype(auto)吗?

我可以从外部访问非类型模板类参数吗?如何?

将非类型模板参数放入元组

C ++ 11,是否可以将实例强制为外部实例,但也可以强制将其作为非类型模板参数的常量表达式?

模板非类型模板参数

从非类型模板参数确定类型

推断非类型模板参数的类型

非类型模板参数的特化

非类型模板参数和要求

很多非类型模板参数

指针非类型模板参数

匹配可变参数非类型模板

非类型模板参数如何编译?

可以将变量模板作为模板模板参数传递吗?

从模板化非类型模板参数推导模板参数

类模板实例的语法作为非类型模板参数