您的老师展示给您的代码是一个不规范的程序,无需诊断,因为它违反了指针实际指向所声称指向的内容的要求(也称为“严格别名”)。
以具体的例子来说,编译器可以分析您的程序,注意到未直接写入A并且未写入short,证明A在创建后从未更改过。
根据C++标准,所有与B相关的操作都可以被证明不能修改A。
一个for(;;)循环甚至是一个范围-for循环可能会被优化为A的静态初始化。在优化编译器下,您老师的代码将优化为未定义的行为。
如果您真的需要一种使用一个值初始化数组的方法,您可以使用以下方法:
template<std::size_t...Is>
auto index_over(std::index_sequence<Is...>) {
return [](auto&&f)->decltype(auto) {
return f( std::integral_constant<std::size_t, Is>{}... );
};
}
template<std::size_t N>
auto index_upto(std::integral_constant<std::size_t, N> ={})
{
return index_over( std::make_index_sequence<N>{} );
}
template<class T, std::size_t N, T value>
std::array<T, N> make_filled_array() {
return index_upto<N>()( [](auto...Is)->std::array<T,N>{
return {{ (void(Is),value)... }};
});
}
现在:
int main() {
auto A = make_filled_array<short, 100, 3>();
std::cout << "\n";
print(A.data(),100);
}
在编译时创建填充的数组,无需循环。
使用 godbolt,您可以看到该数组的值是在编译时计算出来的,并且当我访问第50个元素时提取了值3。
然而,这有些过度(和c++14)。
sizeof(long)
是8,这种方法可能可行。但它不会比标准方法更快。 - Barmak Shemiranisizeof('a')
在C中为sizeof(int)
,但在C++中为sizeof(char)
)。 - Justin Time - Reinstate Monica