【发布时间】:2020-01-04 02:51:03
【问题描述】:
我有一个包含两个弱指针的结构,我希望使用 std::tie 按字典顺序比较这个结构。但是,我遇到了一个奇怪的问题,我意识到我不能使用 std::weak_ptr::lock() 作为 std::tie 的参数。 示例代码:
struct S {
S(std::shared_ptr<int>& f, std::shared_ptr<int>& s) {
first = f;
second = s;
}
bool operator<(const S& rhs) const {
return std::tie(first.lock(), second.lock()) < std::tie(rhs.first.lock(), rhs.second.lock());
}
std::weak_ptr<int> first, second;
};
这样做会导致编译错误,代码为E0304: no instance of function template "std::tie" matches the argument list。
但是,如果我创建新的 std::shared_ptr 对象并将它们设置为 std::weak_ptr::lock() 的值,然后比较 它们,一切正常:
struct S {
S(std::shared_ptr<int>& f, std::shared_ptr<int>& s) {
first = f;
second = s;
}
bool operator<(const S& rhs) const {
// creating shared_ptrs and assigning them the value of std::weak_ptr::lock()
std::shared_ptr<int>
f = first.lock(), s = second.lock(),
rf = rhs.first.lock(), rs = rhs.second.lock();
// compare those shared_ptrs
return std::tie(f, s) < std::tie(rf, rs);
}
std::weak_ptr<int> first, second;
};
int main() {
std::shared_ptr<int>
a(new int(10)),
b(new int(5));
// just two S initializations
S foo(a, b);
S bar(b, a);
if (foo < bar) {
std::cout << "Foo is less than Bar";
}
else {
std::cout << "Otherwise";
}
}
输出:Foo is less than Bar
这可能是什么原因?谢谢!
【问题讨论】:
-
这样想。我可以锁定一个不属于我的对象吗(我有弱指针,它的引用计数不依赖于我)?如果在比较时,对象的引用计数降至零,会发生什么情况?
-
这在 MSVC 2017 中编译得很好,但对我来说 gcc 9.2 失败了。
-
@FrançoisAndrieux 这是 MSVC 遗留的非标准规则的一个实例,允许将非常量引用绑定到右值。使用
/permissive-编译时,MSVC 也会拒绝它。 -
@aschepler 对,这就解释了。谢谢。
标签: c++