gcc 10 拒绝 std::variant 构造函数的隐式转换

问题描述 投票:0回答:1

对于这个简单的代码

#include <vector>
#include <variant>
#include <stdint.h>

using KFPGAData = std::variant<uint16_t>;


int main(int,char**)
{
    int v = 10;
    KFPGAData d = v;

    return 0;
}

使用 gcc 用 -std=c++17 编译它 gcc9 编译通过,但上面的 gcc10 编译失败:

<source>:11:19: error: conversion from 'int' to non-scalar type 'KFPGAData' {aka 'std::variant<short unsigned int>'} requested
   11 |     KFPGAData d = v;
      |                   ^

为什么会出现这种情况?我尝试了其他高版本的 msvc 和 clang 编译器,它们都产生了类似的错误

链接: https://godbolt.org/z/1M9xKd9fj

c++ gcc c++17 std-variant
1个回答
0
投票

来自https://en.cppreference.com/w/cpp/utility/variant/variant强调我的:

转换构造函数。构造一个包含替代类型 T_j 的变体,如果类型中的每个 T_i 存在虚函数 F(T_i) 的重载,则该变体将通过表达式 F(std::forward(t)) 的重载决议进行选择...,但不考虑缩小转换。

© www.soinside.com 2019 - 2024. All rights reserved.