static_assert静态断言失败

静态断言失败,表示编译失败,条件不满足,为false,那么静态断言作为一个编译期计算的特性,他的优先级是很高的,他会优先于模板的实例化,当开始编译时,首先检查静态断言是否成功。

下面一小段代码

template<typename T, typename Y>
inline Y MyConversion::DigitToStr(const T& val)
{
	static_assert(std::is_integral_v<T>);
	if constexpr (std::same_as<Y, std::string>) {
		return std::to_string(val);
	}
	else if constexpr (std::same_as<Y, std::wstring>) {
		return std::to_wstring(val);
	}
	else {
		static_assert(0);        // 始终失败
	}
}

这个函数的意图是:将数值类型转化成字符串类型,我在这里实现了转化成string或者wstring类型,在分支编译中,如果第二个参数是string,那么忽略其他的参数分支。如果不满足if条件,在最后我编写了static_assert(0),我希望当没有符合的参数时,编译错误,可是结果是不对,因为,在编译时,首先就检查到静态断言失败了,所以这个模板根本连实例化的机会都没有,那么对于static_assert(std::is_integral_v<T>);这一句,这个断言是延迟计算的,因为T还没有推导出来,所以这个断言被挂起了,当T被推导出来后,立即断言

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值