Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在constexpr中使用boost单元前缀_C++_Boost_Constexpr - Fatal编程技术网

C++ 如何在constexpr中使用boost单元前缀

C++ 如何在constexpr中使用boost单元前缀,c++,boost,constexpr,C++,Boost,Constexpr,我试图用公里来定义constexpr,而不是用推进单位来定义米。我读到的所有内容都表明下面的两行应该都可以使用,但只有最上面的一行在Clang10中为我编译 这里有一个为懒人准备的godbolt链接: #包括 #包括 #包括 类地球常数{ 公众: //工作 静态constexpr boost::units::quantity earth_radius=(6371008.7714*boost::units::si::meters); //因为boost::units::si::kilo而无法工作

我试图用公里来定义constexpr,而不是用推进单位来定义米。我读到的所有内容都表明下面的两行应该都可以使用,但只有最上面的一行在Clang10中为我编译

这里有一个为懒人准备的godbolt链接:

#包括
#包括
#包括
类地球常数{
公众:
//工作
静态constexpr boost::units::quantity earth_radius=(6371008.7714*boost::units::si::meters);
//因为boost::units::si::kilo而无法工作
静态constexpr boost::units::quantity earth_radius_2=(6371.0087714*boost::units::si::kilo*boost::units::si::meters);
}
注:我是一个嵌入式固件的家伙,想学习现代C++,如果你能用简短的简单的句子来回答你的问题,我的豌豆大小的大脑会很感激。

< P>这是一个解决办法:

static constexpr boost::units::quantity<boost::units::si::length> earth_radius_2{6371.0087714 * boost::units::si::kilo * boost::units::si::meters};

此代码未编译,因为从
int
X
的转换构造函数是
显式的
;因此,不接受复制初始化
xb=3
。如果删除
explicit
关键字,那么代码就会编译。

我不理解您花哨的“explicit”和“Mandatory elision”词,但您的修复程序是有效的。这是boost中的bug吗?我应该提交bug报告吗?我认为这不是bug,而是库代码的结果。对于<代码>显式< /代码>,可以参考C++引用。强制省略意味着,在某些情况下,编译器需要省略将临时变量复制到“正常”变量的操作。例如,如果您编写
xa=X{3}
,原则上1)创建一个临时对象
X{3}
2)初始化
a
作为该临时对象的副本3)处置临时对象。复制省略意味着省略2)和3),并且用
{3}
初始化
a
static constexpr boost::units::quantity<boost::units::si::length> earth_radius_2{6371.0087714 * boost::units::si::kilo * boost::units::si::meters};
struct X{
    explicit X(int){}
    explicit X(const X&) {}
};

int main()
{
    X a{3};
    X b = 3; // Error
}