【问题标题】:C++ pointer to function with reference return type指向具有引用返回类型的函数的 C++ 指针
【发布时间】:2018-12-08 08:22:49
【问题描述】:

我想写一个指向函数的指针,带有引用返回类型

string & cmp(string &s1, string &s2) {
    return s1.size() > s2.size() ? s1 : s2;
}

函数 cmp 很简单,它只是返回较长的字符串。

string string1 = "123";
string string2 = "1234";

string & (*pf)(string &,string &) = cmp;

可以打电话

string &temp = cmp(string1, string2);

但是当我尝试使用pf时,

string &temp = pf(string1, string2);

编译器显示错误:expression must be lvalue

补充:抱歉,IDE 提供的检查信息似乎有误。

我使用CLion作为IDE,红色下划线显示错误,但实际上我可以编译并成功运行....很奇怪,有人知道我的IDE检查出了什么问题吗?或者我可能需要在 CLion 社区发布问题?

【问题讨论】:

  • 我无法重现你提到的错误,对我来说这编译和运行得很好?!
  • 请提供minimal reproducible example。您的 sn-ps 信息不足以重现您的问题,如您所见 here
  • 你使用的是哪个编译器?
  • @lubgr 抱歉,我的 IDE 似乎给出了错误的检查错误....查看我的更新
  • 好吧,如果您认为这是一个错误,请检查您的 IDE 设置两次,如果您无法修复此警告,您可能需要将其报告给 JetBrains。

标签: c++ clion


【解决方案1】:

我认为 CLion 默认情况下只是将函数调用视为右值(即使它确实返回了左值引用)。然而永远不要在 C++ 中使用函数指针std::function 是为了避免 C 函数指针的混乱语法,或者你可以直接编写

auto pf = cmp;

auto& pf = cmp;

虽然不确定推荐哪一个,但我的猜测是auto&,因为cmp 是一个右值。

【讨论】:

  • std::function 是一个重型类型擦除函数容器。它绝对不应该被用作函数指针的一揽子替代品。如果您想要方便的fptr<int(int)> pf 语法,可以使用template <class F> using fptr = F *;
  • @Quentin 另一方面,它很容易使用; IMO 这是一个很好的默认设置,除非您需要进行微优化
【解决方案2】:

我试过了,你只需要把主函数中变量的&去掉即可:

string& (*pf)(string &,string &) = cmp;
string temp = pf(string1, string2);

但我也尝试过其他方法:

string& (*pf)(string &,string &) = cmp;
string &temp = cmp(string1, string2);
temp = pf(string1, string2);
temp = test(string1, string2);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    • 2014-05-12
    • 1970-01-01
    相关资源
    最近更新 更多