gpt4 book ai didi

c++ - 未定义的行为会影响 static_assert 吗?

转载 作者:可可西里 更新时间:2023-11-01 16:18:35 26 4
gpt4 key购买 nike

考虑以下代码:

SomeType x=getX();
for(auto mask = 1u<<(CHAR_BIT*sizeof x - 1);/*...*/;/*...*/)
{
static_assert(sizeof mask>=sizeof x, "Type of numeric parameter is too long");
/*...*/
}

此处,mask 的类型为unsigned。假设 SomeTypelong long。然后 mask 的初始化将由于移位太多而具有未定义的行为。但是 OTOH,有一个 static_assert,它检查未定义的行为不会在运行时发生(因为代码将无法编译)。

但由于 UB 会导致时间悖论和其他意外情况,我不太确定 static_assert 能否保证在这种情况下实际工作。有什么理由可以确定这一点吗?或者是否应该重做此代码以使 static_assertmask 初始化之前出现?

最佳答案

因为您知道您将使用unsigned 作为mask 的类型,所以不需要依赖mask 来完成静态断言。在循环开始之前立即执行。

SomeType x = getX();
static_assert(sizeof 1u >= sizeof x, "Type of numeric parameter is too long");

for(auto mask = 1u << CHAR_BIT*sizeof x-1; /*...*/; /*...*/)
{
/*...*/
}

更简洁的选择是使用辅助函数。

template <typename RetType, typename SomeType>
RetType make_mask(RetType in, SomeType const& x)
{
static_assert(sizeof in >= sizeof SomeType, "Type of numeric parameter is too long");
return (in << (CHAR_BIT*sizeof SomeType)-1);
}

和使用

for(auto mask = make_mask(1u, x); /*...*/; /*...*/)
{
/*...*/
}

关于c++ - 未定义的行为会影响 static_assert 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55031184/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com