小编Bay*_*ita的帖子

如何删除或更改特定要求的C++标准修订版?

让我举一个具体的例子来说明我的意思.

我有两个C++标准草案:N4296现在很老了,最近的修订版N4750.我感兴趣的是一些小节,例如[unord.hash].版本N4296需要从std::hash提供两个嵌套类型argument_typeresult_type,但这一要求不再存在于N4750.

如何找到修订版本,删除此要求的动机及其动机?

c++ std language-lawyer

18
推荐指数
2
解决办法
783
查看次数

std::assignable_from 可能实现背后的基本原理

我有几个关于std::assignable_from行为的问题。Cppreference建议采用以下实现方式:

template< class LHS, class RHS >
concept assignable_from =
  std::is_lvalue_reference_v<LHS> &&
  std::common_reference_with<
    const std::remove_reference_t<LHS>&,
    const std::remove_reference_t<RHS>&> &&
  requires(LHS lhs, RHS&& rhs) {
    { lhs = std::forward<RHS>(rhs) } -> std::same_as<LHS>;
  };
Run Code Online (Sandbox Code Playgroud)

问题是第二个要求的目的是什么,即

std::common_reference_with<
    const std::remove_reference_t<LHS>&,
    const std::remove_reference_t<RHS>&>
Run Code Online (Sandbox Code Playgroud)

谁能详细说明这个要求并提供一些例子吗?

如果上下文很重要,我会尝试从这篇文章中了解 C++20 概念。我的问题与其中的一个具体示例有关:

template <typename D, std::integral T>
requires std::assignable_from<D, T>
void assign_the_thing(D& dest, T&& x)
{
    dest = std::forward<T>(x);
}
Run Code Online (Sandbox Code Playgroud)

但是,无论如何,我怀疑这是否是正确的使用方法assignable_from

c++ c++-concepts c++20

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

构造函数和转换运算符之间的重载解析

我有几个与 C++ 中的重载解析相关的问题。考虑这个例子:

extern "C" int printf (const char*, ...);                                       
                                                                                
struct X {};                                                                    
                                                                                
template <typename T>                                                           
struct A                                                                        
{                                                                               
    A() = default;                                                              
                                                                                
    template <typename U>                                                       
    A(A<U>&&)                                                                   
    {printf("%s \n", __PRETTY_FUNCTION__);}                                     
};                                                                              
                                                                                
template <typename T>                                                           
struct B : A<T>                                                                 
{                                                                               
    B() = default;                                                              
                                                                                
    template <typename U>                                                       
    operator A<U>()                                                             
    {printf("%s \n", __PRETTY_FUNCTION__); return {};}                          
};                                                                              
                                                                                
int main ()                                                                     
{                                                                               
    A<X> a1 (B<int>{});                                                         
} 
Run Code Online (Sandbox Code Playgroud)

如果我用 编译它g++ -std=c++11 a.cppA的构造函数将被调用:

A<T>::A(A<U>&&) [with U = int; T = X] 
Run Code Online (Sandbox Code Playgroud)

如果我用 编译程序g++ -std=c++17 …

c++ language-lawyer overload-resolution

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