- 主题:关于std::variant 初始化的问题
不同的number type
std::variant<int, float> v4{42.3};// ERROR: ambiguous
std::variant<int, double> v5{42.3};// OK
std::variant<int, long double> v6{42.3}; // ERROR: ambiguous
第二个用double可以为什么第三个用long double就不行
--
FROM 67.186.83.*
隐式转换规则导致的吧
第一个加个f就不会了
std::variant<int, float> v4{42.3f};
第三个:MSVC没报错
std::variant<int, long double> v6{42.3};
https://en.cppreference.com/w/c/language/conversion
--
FROM 222.130.137.*
msvc的long double和double是一个类型
gcc和clang的long double 是16 bytes
我没明白为啥long double不能match 42.3
【 在 z16166 的大作中提到: 】
: 隐式转换规则导致的吧
: 第一个加个f就不会了
: std::variant<int, float> v4{42.3f};
: ...................
--
FROM 50.231.249.*
貌似跟g++版本有关
我用刚编译出来的x86_64-linux-musl-g++ 12.2.0编译没问题
ubuntu 22.04自带的g++ 11.3.0也OK。
但是用UOS自带的g++ 8.3.0就有问题,有很长的错误信息说模板推导失败。
ubuntu 18.04里的g++ 7.5.0也是同样失败。
"42.3"是一个double,向long double默认转换应该是允许的。
happy@happy:~/Downloads$ /opt/cross/bin/x86_64-linux-musl-g++ --std=c++17 1.cpp
happy@happy:~/Downloads$ /opt/cross/bin/x86_64-linux-musl-g++ --std=c++20 1.cpp
happy@happy:~/Downloads$ cat 1.cpp
#include <variant>
int main() {
//std::variant<int, float> v4{42.3};
std::variant<int, long double> v4{42.3};
//std::variant<int, double> v5{42.3f};
return 0;
}
【 在 mvtec 的大作中提到: 】
: msvc的long double和double是一个类型
: gcc和clang的long double 是16 bytes
: 我没明白为啥long double不能match 42.3
--
修改:z16166 FROM 222.130.137.*
FROM 222.130.137.*
MSVC的double和long double虽然都是8字节的表示,但是是不同的类型
Microsoft-specific: The long double and double types have the same representation, but are distinct types. For more information, see Built-in types.
https://learn.microsoft.com/en-us/cpp/standard-library/complex-long-double?view=msvc-170
【 在 mvtec 的大作中提到: 】
: msvc的long double和double是一个类型
: gcc和clang的long double 是16 bytes
: 我没明白为啥long double不能match 42.3
--
FROM 222.130.137.*