透明地将临时插入呼叫者的作用域
Transparently insert temporary into caller's scope
在C++中,operator->
具有特殊的语义,因为如果返回的类型不是指针,它将在该类型上再次调用operator->
。但是,中间值由调用表达式作为临时值保留。这允许代码检测返回值的变化:
template<class T>
class wrapper
{
// ...
T val;
struct arrow_helper
{
arrow_helper(const T& temp)
: temp(temp){}
T temp;
T* operator->() { return &temp; }
~arrow_helper() { std::cout << "modified to " << temp << 'n'; }
};
arrow_helper operator->() { return{ val }; }
//return const value to prevent mistakes
const T operator*() const { return val; }
}
然后可以透明地访问T
的成员:
wrapper<Foo> f(/*...*/);
f->bar = 6;
这样做会出什么问题吗?此外,有没有一种方法可以通过operator->
以外的功能获得这种效果?
编辑:我遇到的另一个问题是在这样的表达中
f->bar = f->bar + 6;
因为当来自第二个CCD_ 6的CCD_。我的半优雅解决方案是arrow_helper
有一个隐藏的T orig
,而assert(orig == *owner)
在析构函数中。
不能保证所有更改都会被捕获:
Foo &x = f->bar;
x = 6; /* undetected change */
如果无法通过T
的接口或其他方式获取对T
中任何数据的引用,我认为这应该是安全的。如果有任何方法可以获取这样的指针或引用,那么一旦有人保存了这样的引用并在以后使用它,您就完成了,并且处于未定义的行为中。
相关文章:
- 未在作用域中声明unordered_map
- 有没有一种方法可以在编译时获得作用域类名
- C++quit()函数中可能存在作用域问题
- 未在此作用域OpenCV3.4中声明cvSaveImage
- 全局作用域中函数指针的赋值
- 在类函数中初始化外部作用域变量
- 不同作用域中的静态变量和全局变量
- 是同一作用域的函数部分中的函数调用
- 未在此作用域中声明的函数和变量 (C++)
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 将作用域枚举转换为基础类型
- 表达式必须具有完整或无作用域的枚举图
- 在构造函数中输入对象时C++类成员作用域
- 无法让"std::enable_if"适用于无作用域枚举
- 为什么不能直接引用作用域枚举类成员,而不能为无作用域枚举生成类成员?
- 函数未在作用域中声明 / 如何结合使用 header.h、header.cpp 和 main.cpp?
- 错误:表达式必须具有算术、无作用域枚举或带有运算符重载的指针类型
- 如何在C++中访问作用域的变量输出?
- 重载时未在 C++ 的作用域错误中声明
- 透明地将临时插入呼叫者的作用域