在c++ 11中,如何获得一个没有名称的临时左值
In C++11, how can I get a temporary lvalue without a name?
我有一个传统的C库和一个函数(setsockopts
)想要一个指针参数。在c++ 11 (gcc 4.8)中,我可以在不初始化命名变量的情况下传递这个参数吗?
我有以下不令人满意的解决方案:
#include <iostream>
#include <memory>
int deref(int const * p) {return * p;}
using namespace std;
int main() {
int arg = 0; cout << deref(& arg) << endl;
// works, but is ugly (unnecessary identifier)
cout << deref(& 42) << endl;
// error: lvalue required as unary ‘&’ operand
cout << deref(& * unique_ptr<int>(new int(42))) << endl;
// works, but looks ugly and allocates on heap
}
我只是创建一个包装器到setsockopt
如果这真的是一个麻烦(未测试)
template <typename T>
int setsockopt(int socket, int level, int optname, const T& value) {
return setsockopt(socket, level, optname, &value, sizeof(value));
}
...
setsockopt(socket, IPPROTO_TCP, TCP_NODELAY, 1);
编写一个函数模板将右值转换为左值:
template<typename T>
T &as_lvalue(T &&val) {
return val;
}
现在,使用它:
deref(&as_lvalue(42));
警告:这不会延长临时对象的生命周期,所以你不能在创建临时对象的完整表达式结束后使用返回的引用。
可以将const
引用绑定到一个临时对象:
cout << deref(addressof<const int>(42)) << endl;
相关文章:
- 有没有一个 c++ gmp 库函数与 python gmpy2 库 divm(..) 函数相同?
- 有没有一个迭代器的例子,它不会使用 ptrdiff_t 作为其difference_type?
- 对于 ~95% 写入/5% 读取线程安全的无序列图,有没有一个简单的解决方案?
- 如何判断是否有另一个线程试图保持互斥锁?
- 有没有一个 posix lstatat 调用这样的事情
- 为什么 GCC 无法优化,除非返回值有名称?
- 有没有一个C++等同于逻辑的时间
- 非 OOP 版本的"财产"是否有名称?
- 有没有一个不平凡的例子,其中 int* x = new int 实际上是有用的
- C++:此模式是否有名称,是否可以改进
- 有没有一个带有距离标记的最短路径算法的开源实现
- 有没有一个很好的通用方法来用ruby包装swig生成的类
- Boost:阻塞,直到队列有另一个项目
- 有没有一个简单的移动结构的例子不会被忽略?
- 有没有一个调试器可以让我在代码中后退一步
- 有没有一个好的C++工具可以解析十进制
- 有没有一个函数可以计算一个向量中所有的正数
- 有没有一个网站可以生成所有可能的显示单词的方式
- 有没有一个工具可以解析C++来强制文档
- 如何测试我的FIX客户端?有没有一个假的FIX交换,我可以使用