Why std::sort doesn't accept Compare classes declared within a function

后端 未结 2 1958
醉酒成梦
醉酒成梦 2021-01-05 18:30

I was at work, writing the Comparators in a function (to move later, when I decided where was best), and noticed this peculiarity. I thought about it for a while, and reali

2条回答
  •  野趣味
    野趣味 (楼主)
    2021-01-05 19:20

    In C++03, template arguments could not have internal linkage:

    [C++03: 14.6.4.2/1]: For a function call that depends on a template parameter, if the function name is an unqualified-id but not a template-id, the candidate functions are found using the usual lookup rules (3.4.1, 3.4.2) except that:

    • For the part of the lookup using unqualified name lookup (3.4.1), only function declarations with external linkage from the template definition context are found.
    • For the part of the lookup using associated namespaces (3.4.2), only function declarations with external linkage found in either the template definition context or the template instantiation context are found.

    [..]

    This was changed (issue #561: "Internal linkage functions in dependent name lookup") in C++11:

    [C++11: C.2.6]: 14.6.4.2
    Change: Allow dependent calls of functions with internal linkage
    Rationale: Overly constrained, simplify overload resolution rules.

    resulting in:

    [C++11: 14.6.4.2/1]: For a function call that depends on a template parameter, the candidate functions are found using the usual lookup rules (3.4.1, 3.4.2, 3.4.3) except that:

    • For the part of the lookup using unqualified name lookup (3.4.1) or qualified name lookup (3.4.3), only function declarations from the template definition context are found.
    • For the part of the lookup using associated namespaces (3.4.2), only function declarations found in either the template definition context or the template instantiation context are found.

    [..]

    (Spot the missing "with external linkage" qualification.)

    Since your main()::ComparitorInner& has internal linkage, and the instantiation of std::sort requires this type to be a template parameter (albeit deduced), your code is only valid in C++11.

提交回复
热议问题