为什么 std::get<T> 其中 T 是调用 constexpr 函数失败的结果?
Why std::get<T> where T is the result of call a constexpr function fails?
我的问题是这个代码实际上是如何工作的:
std::variant<int, std::string> is;
constexpr int i = 0;
std::cout << std::get<i>(is);
现在,如果我写以下代码,它会失败:
std::variant<int, std::string> is;
std::cout << std::get<is.index()>(is);
在文档中https://en.cppreference.com/w/cpp/utility/variant/index我发现索引的返回类型是constexpr
。有人能帮我吗?
更新
现在,使用std::string_view代替std::string,哪一个也可以是constexpr,并使is
也是constexpr。它有效。感谢
constexpr
值调用constexpr
方法,则该方法可以返回constexpr
值。
所以你必须将is
定义为constexpr
constexpr std::variant<int, std::string> is;
不幸的是,当if不是文字类型时,std::variant
不能被声明为constexpr
,所以当它的一个类型(如std::string
(不是文字时。
但有效,例如
constexpr std::variant<int, long> is;
模板参数值必须在编译时已知。
std::variant<int, std::string> is;
constexpr int i = 0;
std::cout << std::get<i>(is);
这是因为i
的值是用constexpr
声明的,因此在编译时是已知的,所以您实际上是在调用std::get<0>(is)
。
std::variant<int, std::string> is;
std::cout << std::get<is.index()>(is);
这是因为is
没有用constexpr
声明,因此is.index()
返回的值在运行时之前是未知的,因此不能在模板参数中使用。
相关文章:
- 为什么除非添加括号,否则构造函数上的模板替换会失败?
- 模板参数推导失败,函数参数/参数不匹配
- 从类型std::函数传递变量失败,尽管调用方期望的类型完全相同
- 如果我重新定义 sqrt 函数,为什么使用 std::sqrt 失败?
- C++ strcpy 函数在少数主要情况下失败
- 在构造函数中分配内存失败是如何冒泡的
- 无法调用成员函数,尝试正确执行此操作仍然失败
- 非静态成员失败的线程调用函数
- 使用用户定义的类型 UDT 实例化 std::atomic<>。如果 UDT 具有虚函数,则 l 墨水将失败。为什么?
- 使用显式模板参数列表和 [temp.arg.explicit]/3 的函数调用的演绎失败
- 函数返回时,带指针的复制构造函数失败
- WriteProcessMemory 在函数内部失败
- 从 C#-DLL 调用函数的 C++ 失败
- 使用已删除的函数进行编译失败,并显示 uclibc
- MPICH 的 MPI_Comm_dup() 在复制构造函数中失败
- 代码在 msvcrt .dll函数上设置断点失败
- 作为模板参数的成员函数指针在继承的成员函数上失败,如何以及为什么?
- 引用构造函数时链接失败
- 断言 sv_count !=0 失败 - 函数 train_auto,SVM 类型 - EPS_SVR
- C++失败函数的 while 语句