MSVC编译器甚至不优化使用/ Ox / EHsc的noexcept调用

编程入门 行业动态 更新时间:2024-10-11 19:14:00
本文介绍了MSVC编译器甚至不优化使用/ Ox / EHsc的noexcept调用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

这是一个例子。

#include <cstdlib> template <typename TInteger> class range_iterated_helper final { public: constexpr range_iterated_helper(TInteger from, TInteger to) noexcept : m_from(from), m_to(to) { } struct const_iterator final { const_iterator& operator ++ () noexcept { ++index; return *this; } const TInteger operator * () noexcept { return index; } bool operator == (const_iterator const& other) const noexcept { return index == other.index; } bool operator != (const_iterator const& other) const noexcept { return index != other.index; } TInteger index; }; constexpr const_iterator begin() const noexcept { return { m_from }; } constexpr const_iterator end() const noexcept { return { m_to }; } constexpr const_iterator cbegin() const noexcept { return { m_from }; } constexpr const_iterator cend() const noexcept { return { m_to }; } private: TInteger m_from; TInteger m_to; }; template <typename TInteger> constexpr range_iterated_helper<TInteger> make_integer_range(TInteger from, TInteger to) noexcept { return { from, to }; } template <typename TInteger> constexpr range_iterated_helper<TInteger> make_integer_range_to(TInteger to) noexcept { return { 0, to }; } constexpr range_iterated_helper<size_t> make_indices(size_t size) noexcept { return { 0, size }; } size_t f1(size_t n) { size_t result = 0; for (auto x : make_indices(n)) result *= x; return result; } size_t f2(size_t n) { size_t result = 0; for (size_t x = 0; x < n; ++x) result *= x; return result; }

godbolt/g/HUqhpq

godbolt/g/HUqhpq

我们有一些帮助代码,允许基于范围的语法为[0; n)迭代。使用/ EHsc编译 f1 时,调用( noexcept )函数 begin 和 end 保持不变。 是否有解决此问题的方法?

We have some helper code that allows ranged-based for syntax for [0; n) iteration. When f1 is compiled with /EHsc the calls to (noexcept) functions begin and endare kept without any optimizations. Are there any workarounds to this problem?

推荐答案

这看起来像VS聚合初始化的错误。以下添加修复了问题

This looks like a bug of VS aggregate initialization. The following addition fixes the problem

const_iterator(TInteger index_) : index(index_) { }

更多推荐

MSVC编译器甚至不优化使用/ Ox / EHsc的noexcept调用

本文发布于:2023-10-19 17:53:12,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1508314.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:编译器   MSVC   Ox   noexcept   EHsc

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!