小编Jac*_*eka的帖子

std :: function是否允许在其返回类型中从引用隐式转换为复制?

在下面的代码中,编译器以静默方式将return-by-copy函数指针强制转换为const-by-const-reference std :: function.调用std :: function实例时,将返回对副本的引用,并且应用程序崩溃(大多数情况下;).

通过比较的方式,普通函数指针不允许这种隐式转换,所以我想知道我是否应该向编译器供应商抱怨(在这种情况下是gcc 4.8),还是这个行为是由标准规定的?

#include <iostream>
#include <functional>

typedef std::function<const std::string&(const std::string& x)> F;

std::string bad(const std::string& x) { return x; }
const std::string& good(const std::string& x) { return x; }

typedef const std::string& (*FP)(const std::string&);

int main(int, char**) {
    std::cout << F(&good)("hello") << std::endl;
    std::cout << F(&bad)("hello") << std::endl;

    FP a = &good;
    // FP b = &bad;  Not allowed!

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

PS这是现实世界问题的简化版本,其中bad实际上是一个lambda返回某种类型的成员:

typedef std::function<const std::string&(const X& x)> F;
F f = …
Run Code Online (Sandbox Code Playgroud)

c++ return-by-reference c++11 std-function

12
推荐指数
1
解决办法
617
查看次数

标签 统计

c++ ×1

c++11 ×1

return-by-reference ×1

std-function ×1