I do not understand why Clang-Tidy produces the error Clang-Tidy: Do not implicitly decay an array into a pointer in the following example:
struct Foo {
explicit Foo(std::string _identifier) : identifier(std::move(_identifier)) {}
std::string identifier;
};
struct Bar {
template<typename... Ts>
explicit Bar(Ts &&...args) : foo(std::forward<Ts>(args)...) {} // <-- Error
Foo foo;
};
Bar bar("hello world");
From the error I understand that "hello world" being an array of type const char[11] (or similar) is decayed to type const char* somewhere during std::forward. But why and how can I fix this error? std::make_shared<Foo>("hello world") is very similar regarding usage of std::forward and does work.
CodePudding user response:
This looks like a bogus diagnostic. I would disable it globally, since this usecase is so common.
CodePudding user response:
From the error I understand that
"hello world"being an array of typeconst char[11](or similar) is decayed to typeconst char*somewhere duringstd::forward
"hello world" is a char const[12] and decays to char const* when you
construct a temporary std::string to call Foo's constructor.
But why and how can I fix this error?
A way to suppress that warning is:
Bar bar(std::string{ "hello world" });
std::make_shared<Foo>("hello world")is very similar regarding usage ofstd::forwardand does work.
This is interesting:
Foo foo0("hello world"); // No warning
auto foo1 = std::make_shared<Foo>("hello world"); // No warning
Bar bar0("hello world"); // Warning
auto bar1 = std::make_shared<Bar>("hello world"); // Warning
