小编R K*_*R K的帖子

std::可选::使用 std::addressof 进行变换

考虑以下代码:

#include <memory>
#include <optional>

template <typename T>
constexpr T * arg_to_pointer(T & arg) noexcept {
    return std::addressof(arg);
}

int main() {
    std::optional<int> foo;

    auto * test = foo.transform(arg_to_pointer<int>).value_or(nullptr);
    //auto * test = foo.transform(std::addressof<int>).value_or(nullptr);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

未注释掉的行(将一个哑包装器std::addressof作为函数参数传递给std::optional::transform)可以编译并正常工作。被注释掉的行(尝试std::addressof直接使用的行)没有 - 我收到一条错误,指示模板参数推导失败(此处使用 GCC 13.2 的实时示例,尽管在 Clang 16.0 中观察到类似的行为)。为什么是这样?std::addressof标准和我周围的愚蠢包装有什么区别?

c++ stdoptional c++23

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

允许访问命名空间之外的类的受保护成员函数

考虑以下代码:

namespace A
{
  class B
  {
  protected:
    friend class C;
    static void foo();
  };
}

class C
{
public:
  C() { A::B::foo(); }
};

int main()
{
  C c;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

按照当前构造,此代码将无法编译 - 中 声明的友谊class B适用于 a (当前不存在)A::C,而不是C全局命名空间中的 the 。假设我无法添加C到非全局命名空间,我如何有效地解决这个问题?我尝试过使用friend class ::C;,但编译器不喜欢这样。我也尝试过在范围class C;之前进行向前声明namespace A,但这似乎也不起作用。

c++ namespaces friend forward-declaration c++17

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

无法设置默认函数关闭

我正在尝试创建一个方法,该方法采用 anOption<impl Fn() -> ()>作为参数,并且,如果此参数是Some(func),则存储func为闭包,但是,如果是None,则存储一些默认函数作为闭包。具体来说,我的代码如下:

fn foo() 
{
    println!("HI");
}

fn bar(baz: Option<impl Fn () -> ()>)
{
    let func = match baz {
        Some(func) => func,
        //None => foo,
        None => unimplemented!()
    };

    func();
}

pub fn main() {
    bar(Some(foo));
}
Run Code Online (Sandbox Code Playgroud)

按原样,代码可以编译,这向我表明这foo确实应该与impl Fn () -> (). 但是,如果我用注释掉的手臂替换None我的手臂以设置为我的“默认实现”,我会收到以下错误:matchNonefoo

error[E0308]: `match` arms have incompatible types
  --> <source>:10:17
   |
6  |   fn bar(baz: Option<impl Fn …
Run Code Online (Sandbox Code Playgroud)

closures rust

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