小编And*_*rew的帖子

为什么 GCC 为 `std::ranges::max` 中的每次比较复制对象?

考虑以下示例 ( Godbolt ):

#include <vector>
#include <iostream>
#include <ranges>
#include <algorithm>

struct A
{
    A() {}
    A( const A& ) { std::cout << "Copy\n"; }
    A( A&& ) noexcept { std::cout << "Move\n"; }

    A& operator=(const A&) { std::cout << "Copy assigned\n"; return *this; }
    A& operator=( A&& ) noexcept { std::cout << "Move assigned\n"; return *this; }

    int x = 10;
};

int main()
{
    std::vector<A> vec( 10 );
    std::cout << "Init\n";
    std::cout << std::ranges::max( vec, [] ( …
Run Code Online (Sandbox Code Playgroud)

c++ gcc stl clang std-ranges

14
推荐指数
1
解决办法
740
查看次数

在此类的方法的 require 子句中使用类

这是一个简单的例子:

#include <type_traits>
#include <ranges>
#include <vector>

struct MyClass
{
    void f( int ) {}
    void f( char ) {}

    template <std::ranges::input_range Rng>
        requires requires ( MyClass cls, const std::ranges::range_value_t<Rng>& val )
        {
            { cls.f( val ) };
        }
    void f( Rng&& rng ) {}
};

int main()
{
    MyClass cls;
    cls.f( 10 );
    cls.f( 'a' );
    cls.f( std::vector<int>{ 10, 15 } );
}
Run Code Online (Sandbox Code Playgroud)

根据Godbolt 的说法,这个示例在 MSVC 和 GCC 上编译成功,但在 Clang 上编译失败。标准对此类要求表达式有何规定?

更新:我们可以简化示例,以便方法调用中不存在循环(Godbolt):

#include <type_traits> …
Run Code Online (Sandbox Code Playgroud)

c++ language-lawyer compiler-specific c++-concepts c++20

11
推荐指数
1
解决办法
249
查看次数

MSVC 上的“std::views::split”

我想用 和 的标记分割字符串std::views::split,并为每个检索到的子字符串调用该std::from_chars函数。这是一个 MRE ( https://godbolt.org/z/1K71qo9s4 ),它在 GCC 上编译成功,但在 MSVC 上编译失败:

#include <iostream>
#include <ranges>
#include <string>
#include <charconv>
 
 
int main()
{
    std::string source{"10%15%20%35"};
    for ( auto i : source | std::views::split('%') )
    {
        int x;
        std::from_chars( i.begin().base(), i.end().base(), x );
        std::cout << x << ' ';
    }
}
Run Code Online (Sandbox Code Playgroud)

奇怪的是,根据cppreference , P2210R2中的行为std::views::split发生了变化,提供了效果为base()

相当于return cur_

然后,根据编译器支持页面P2210R2自 19.31 起 MSVC 支持该示例,因此该示例应该可以工作。

c++ stl compiler-specific c++20 std-ranges

5
推荐指数
1
解决办法
217
查看次数

如何在 C++ 中扩展现有类型(例如 float)的格式规范?

我想扩展浮点类型的格式化选项,最好保留一些现有选项。例如,我想type为带有单位的测量添加一个新的说明符,像这样编写std::format({:.5mm}, 0.05f)并使用 打印我的数据precision=5,但也乘以 1000 并以“mm”为前缀。这可能吗?

c++ c++20 stdformat

1
推荐指数
1
解决办法
70
查看次数