如何在 constexpr 中使用升压单元前缀

How to use boost unit prefixes in a constexpr

我正在尝试使用升压单位以公里而不是米来定义 constexpr。我读过的所有内容都表明下面的两行都应该有效,但只有最上面的一行在 clang 10 中为我编译。

这是给懒人的天赐良机 link:https://godbolt.org/z/38je3z

#include <boost/units/systems/si.hpp>
#include <boost/units/systems/si/prefixes.hpp>
#include <boost/units/unit.hpp>
class earthConstants{
    public:
    // Works
    static constexpr boost::units::quantity<boost::units::si::length> earth_radius = (6371008.7714* boost::units::si::meters);
    // doesn't work because of boost::units::si::kilo
    static constexpr boost::units::quantity<boost::units::si::length> earth_radius_2 = (6371.0087714 * boost::units::si::kilo * boost::units::si::meters);
 }

注意:我是一名正在尝试学习现代 C++ 的嵌入式固件专家,所以如果您能在回答中使用简短的简单句子和小词,我的豌豆大小的大脑会很感激。

这是一个解决方法:

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

为什么这与问题中的代码不同?

根据c++17标准,如果=右边的表达式相同,用=初始化和直接初始化(如上解)是一样的类型作为变量。请参阅讨论 here。 显然这里不是这样的,从=右边的类型到左边的类型的转换大概标记为explicit.

这是一个例子。

struct X{
    explicit X(int){}
    explicit X(const X&) {}
};

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

此代码无法编译,因为从intX的转换构造函数是explicit;因此,不接受复制初始化 X b = 3。如果删除 explicit 关键字,则代码会编译。