c++ - 无法在 std::variant 中采用相同类型

标签 c++ c++17

我正在使用 c++17,并且想编写类似这样的代码,

#include <variant>
typedef int NewInt;
int main() {
    std::variant<NewInt, int> n = 1;
}

但它会发出编译错误,

po.cpp: In function ‘int main()’:
po.cpp:5:35: error: conversion from ‘int’ to non-scalar type ‘std::variant<int, int>’ requested
     std::variant<NewInt, int> n = 1;
                               ^

我如何定义像 std::variant<NewInt, int> 这样的类型?还是不可能?

最佳答案

类型别名只是现有类型的别名,而不是新类型。所以你有两个整数的变体。虽然这是允许的,但您必须明确解决歧义。 std::variant 有一个合适的构造函数:

std::variant<NewInt, int> n{ std::in_place_index<0>, 1 };

以上将构造第一个整数成员(您的NewInt)。如果你想构建第二个,这是显而易见的:

std::variant<NewInt, int> n{ std::in_place_index<1>, 1 };

关于c++ - 无法在 std::variant 中采用相同类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47858965/

相关文章:

c++ - 用说明符extern声明的C++中的标识符链接

c++ - 在 std::variant 中按类型获取索引

c++ - C++17 中新的基于范围的 for 循环如何帮助 Ranges TS?

c++ - 我是否正确使用了头文件?

c++ - 从 map 中删除指针

c++ - 如何将非静态成员函数作为模板参数传递给另一个成员函数?

c++ - 未找到 macOS Clang C++17 文件系统 header

c++ - 使用 std::enable_if 时进行优化

C++ 实例 VS 指针 VS 引用

c++ - 存储要删除的 vector 元素