考虑以下示例 ( 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) 这是一个简单的例子:
#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) 我想用 和 的标记分割字符串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 支持该示例,因此该示例应该可以工作。
我想扩展浮点类型的格式化选项,最好保留一些现有选项。例如,我想type为带有单位的测量添加一个新的说明符,像这样编写std::format({:.5mm}, 0.05f)并使用 打印我的数据precision=5,但也乘以 1000 并以“mm”为前缀。这可能吗?