static_assert静态断言失败

  • Post author:
  • Post category:其他


静态断言失败,表示编译失败,条件不满足,为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被推导出来后,立即断言



版权声明:本文为weixin_42951026原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。