gpt4 book ai didi

c++ - std::move on const char* 完美转发

转载 作者:行者123 更新时间:2023-12-04 13:05:17 25 4
gpt4 key购买 nike

我在 MSVC v19.28 编译器(更高版本修复了这个问题)上遇到了一个有趣的问题,其中 const char* 被传递给可变参数模板 class 无法正确解析。如果将 const char* 传递给可变参数模板函数,则不会出现错误。

为了清楚起见,这里是代码:

#include <type_traits>

template <typename... T_Args>
struct Foo
{
template <typename T_Func>
void foo(T_Func func, T_Args&&... args)
{
func(std::forward<T_Args>(args)...);
}
};

template <typename T_Func, typename... T_Args>
void bar(T_Func func, T_Args&&... args)
{
func(std::forward<T_Args>(args)...);
}

int main()
{
bar([](int, float, const char* c){ }, 5, 5.0f, "Hello world");

// <source>(26): error C2672: 'Foo<int,float,const char *>::foo': no matching overloaded function found
// <source>(26): error C2440: 'initializing': cannot convert from 'const char [12]' to 'const char *&&'
// <source>(26): note: You cannot bind an lvalue to an rvalue reference
Foo<int, float, const char*> f;
f.foo([](int, float, const char* c){ }, 5, 5.0f, "Hello world");

// this compiles, but what are the repurcussions of std::move() on a string literal?
Foo<int, float, const char*> g;
g.foo([](int, float, const char* c){ }, 5, 5.0f, std::move("Hello world"));
}

由于我在一个大型团队中工作,我无法推荐升级工具链/编译器,因此我正在寻找解决方法,直到可以更新编译器。

解决方法之一是使用 std::move("Hello world")std::move 做什么 const char* 以及潜在的副作用是什么?

最佳答案

What is std::move doing to a const char [12] and what are the potential side-effects?

普通的数组到指针的隐式转换,并没有。指针类型没有移动构造函数或移动赋值运算符,因此“移动”是(数组衰减到的指针的)拷贝。

旁白:我认为您的模板并不像您认为的那样。包 T_Args... 在调用 Foo::foo 时不会推导出来,因此您没有通用引用,而是右值引用。

你的意思是像

template <typename... T_Args>
struct Foo
{
template <typename T_Func, typename... T_Args2>
void foo(T_Func func, T_Args2&&... args)
{
static_assert(std::is_constructible_v<T_Args, T_Args2> && ..., "Arguments must match parameters");
func(std::forward<T_Args2>(args)...);
}
};

或者可能更简单

struct Foo
{
template <typename T_Func, typename... T_Args>
void foo(T_Func func, T_Args&&... args)
{
func(std::forward<T_Args>(args)...);
}
};

关于c++ - std::move on const char* 完美转发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69814356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com