我想将一个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) 考虑以下代码:
#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
[namespace.std]不允许获取命名空间中大多数函数的地址或引用std。这是一个很大的陷阱,因为将标准库函数作为参数传递似乎通常是有效的,尽管这可能会在不同的编译器上停止工作,甚至更糟。
据推测,这样做是为了允许实现专门优化标准库。这个限制使得 C++ 更难使用。
您能否给出明确的示例来说明 C++ 实现如何从std命名空间的这种限制中受益?
如果这些优化如此重要以至于使得 C++ 更难使用,为什么一些非系统库不需要同样的东西呢?
我确实希望能够在不声明 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)