Skip to content

[Update Needed, No Longer Always True Since C++23] F.19: For “forward” parameters, pass by TP&& and only std::forward the parameter #2277

Description

@yaoxinliu

Consider the following code:

#include <string>

auto f1(auto&& v) {
    return v;
}

auto f2(auto&& v) {
    return std::forward<decltype(v)>(v);
}

int main() {
    return f1(std::string("hello")).size() + f2(std::string("hello")).size();
}

clang will generate the same assembly code for f1 and f2. However,

  • As per the C++ core guidelines, f2 is recommended;
  • As per p0527r1, f1 is enough since C++23.
  • It's possible that f2 has an extra function call than f1. We should not depend on the compiler to optimize that out; even if it almost always does.

Should we still always std::forward a universal reference argument? or the C++ core guidelines should be updated?

Cited from https://stackoverflow.com/questions/79657383/should-we-still-always-stdforward-a-universal-reference-argument-even-if-unnec

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions