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

@yaoxinliu

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

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions