败犬日报 2025-09-26
败犬日报 2025-09-26
1. 能不能限制一个类型只能创建临时对象,禁止具名
相关提问:https://www.zhihu.com/question/667304681
不能。一个常见错误是构造 private + T&& create();
,这样是悬垂引用(因为函数内变量或对象的生命周期在函数里):
cpp
struct A {
private:
A() {}
public:
static A&& create() {
return A{}; // warning: returning reference to temporary
}
static A&& create_v2() {
A a;
return a; // warning: reference to local variable ‘a’ returned
}
};
单例模式 T& create();
不是临时对象,不符合要求。
一旦 T create();
就允许具名了(这个叫静态工厂方法)。
综上,无解。views 那堆东西也是这样,要自己保证不悬垂。
kedixa 的评论提供了个方法,用形参生命周期来解决悬垂的问题,代码如下。这可能是最接近的答案,唯一不足的是形参的生命周期是在函数末尾结束还是在全表达式末尾结束,这个东西是实现定义的。实现定义,就是如果编译器有保障,那就没问题(跨平台 / 编译器的代码就不太推荐了)。
cpp
#include <cstdio>
struct A {
private:
A() {}
public:
static A&& create(A&& a = A{}) { return a; }
void f() { std::puts("A::f()"); }
};
int main() {
A::create().f();
}