3

我看到了这样使用的narrow_cast代码

int num = narrow_cast<int>(26.72);
cout << num;

问题是我的编译器说:

'narrow_cast' was not decleared in this scope. 

我应该定义narrow_cast自己还是以错误的方式使用它,还是没有类似的东西narrow_cast

4

2 回答 2

7

narrow_castgsl 真的是一个static_cast. 但它更明确,您可以稍后搜索它。您可以自己检查实现

// narrow_cast(): a searchable way to do narrowing casts of values
template <class T, class U>
GSL_SUPPRESS(type.1) // NO-FORMAT: attribute
constexpr T narrow_cast(U&& u) noexcept
{
    return static_cast<T>(std::forward<U>(u));
}

narrow_cast不是标准 C++ 的一部分。您需要gsl来编译和运行它。您可能错过了这一点,这就是它没有编译的原因。

于 2019-10-29T22:19:47.860 回答
6

在 Bjarne Stroustrup 的“The C++(11) 编程语言”一书中的“11.5 显式类型转换”一节中,您可以看到它是什么。

基本上,它是一个自制的显式模板化转换函数,在这种情况下可以缩小值并抛出异常时使用,而 static_cast 不会抛出异常。

它对目标类型进行静态转换,然后将结果转换回原始类型。如果你得到相同的值,那么结果是好的。否则,不可能得到原始结果,因此值被缩小丢失信息。

您还可以看到它的一些示例(第 298 和 299 页)。

这个结构可以在第三方库中使用,但据我所知它不属于 C++ 标准。

于 2020-06-03T16:14:19.360 回答