如何在 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
}
此代码无法编译,因为从int
到X
的转换构造函数是explicit
;因此,不接受复制初始化 X b = 3
。如果删除 explicit
关键字,则代码会编译。
我正在尝试使用升压单位以公里而不是米来定义 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
}
此代码无法编译,因为从int
到X
的转换构造函数是explicit
;因此,不接受复制初始化 X b = 3
。如果删除 explicit
关键字,则代码会编译。