gpt4 book ai didi

c++ - std::function 复制运算符的奇怪行为 (MSVC2012)

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:50:38 26 4
gpt4 key购买 nike

我在尝试使用 function<> 对象时遇到了 bad_function_call 异常问题。

发现问题会引导我进入下一个简单示例: http://ideone.com/Mwvw7s

主要摘录:

std::function<void(void*)> f1;
std::function<void(const void*)> f2;
f1 = f2; // Could fail, but didn't

if(f1)
f1(nullptr); // Should never run
else
std::cout << "Skip f1" << std::endl; // Should run

if(f2)
f2(nullptr);
else
std::cout << "Skip f2" << std::endl;

这使 f1 生效,而不管 f2。此问题仅发生在 MSVC2012 上(未尝试任何其他版本的 MS 编译器)并且在 GCC 中按预期工作。

问题是:

  1. 这个问题是 MSVC2012 特有的吗? (任何人都可以在 MSVC2013 上测试)
  2. 这个问题是众所周知的吗?
  3. [如果 1 和 2 为“否”]我应该向谁投诉?

更新

  1. MSVC2013 不会重现此类问题。
  2. 以防万一有人关心,GitHub 存储库有问题:https://github.com/comargo/functional_test

最佳答案

这似乎是 MSVC2012 的问题; MSVC2013 正确运行它 ( live example )。

function 类模板实例化实例的分配来自模板的不同实例化(即具有不同的签名)委托(delegate)给构造函数,并由 [func 的特殊子句处理.wrap.func.con]:

8 - Postconditions: !*this if any of the following hold: [...]

  • F is an instance of the function class template, and !f

我猜测库实现者未能为 MSVC2012 实现此子句;在 function 类模板实例之间进行转换时,最直接的策略是将源类型包装在转换包装器中;很容易忘记检查源实例是否已使用。

作为解决方法,您可以编写:

f2 ? (f1 = f2) : (f1 = nullptr);

关于c++ - std::function 复制运算符的奇怪行为 (MSVC2012),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29668930/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com