相关疑难解决方法(0)

通过std :: bind传递rvalues

我想将一个rvalue传递std::bind给一个在C++ 0x中采用rvalue引用的函数.我无法弄清楚该怎么做.例如:

#include <utility>
#include <functional>

template<class Type>
void foo(Type &&value)
{
    Type new_object = std::forward<Type>(value);    // move-construct if possible
}

class Movable
{
public:
    Movable(Movable &&) = default;
    Movable &operator=(Movable &&) = default;
};

int main()
{
    auto f = std::bind(foo<Movable>, Movable());
    f();    // error, but want the same effect as foo(Movable())
}
Run Code Online (Sandbox Code Playgroud)

c++ std rvalue rvalue-reference c++11

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

我可以使用标准库中定义的函数的地址吗?

考虑以下代码:

#include <cctype>
#include <functional>
#include <iostream>

int main()
{
    std::invoke(std::boolalpha, std::cout); // #1

    using ctype_func = int(*)(int);
    char c = std::invoke(static_cast<ctype_func>(std::tolower), 'A'); // #2
    std::cout << c << "\n";
}
Run Code Online (Sandbox Code Playgroud)

在此,对的两个调用std::invoke已标记为将来参考。预期的输出是:

a
Run Code Online (Sandbox Code Playgroud)

在C ++ 20中可以保证预期的输出吗?

(注意:有两个函数tolower,一个称为in <cctype>,另一个称为in <locale>。引入了显式强制转换以选择所需的重载。)

c++ c++-standard-library language-lawyer unspecified-behavior c++20

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

命名空间 std 中不可寻址函数的基本原理是什么?

[namespace.std]不允许获取命名空间中大多数函数的地址或引用std。这是一个很大的陷阱,因为将标准库函数作为参数传递似乎通常是有效的,尽管这可能会在不同的编译器上停止工作,甚至更糟。

据推测,这样做是为了允许实现专门优化标准库。这个限制使得 C++ 更难使用。

您能否给出明确的示例来说明 C++ 实现如何从std命名空间的这种限制中受益?

如果这些优化如此重要以至于使得 C++ 更难使用,为什么一些非系统库不需要同样的东西呢?

c++ language-design

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

在没有 lambda 的情况下将模板化函数作为方法参数传递?

我确实希望能够在不声明 lambda 的情况下使用 extFunction or std::maxorstd::min作为 square 方法的参数:

template<typename T>
T extFunction(T a, T b)
{
    return a;
}

class Stuff
{
public:
    template <typename F>
    int square(int num, int num2, F&& func) 
    {
        return func(num, num2);
    }
};

int main()
{
    Stuff s;
    std::cout << s.square(1, 2, std::max<int>) << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是编译器(gcc 11.1)告诉我:

函数不明确:“无法推导出模板参数‘ F’”

没有 lambdas 有没有一种简单的方法可以做到这一点?

编辑:

也许展示如何使用 lambdas 做到这一点会很有趣:

std::cout << s.square(1,2,[](auto&& a, auto&& b){return std::max(a,b);}) << std::endl; …
Run Code Online (Sandbox Code Playgroud)

c++ lambda templates function-pointers function-templates

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