为文字字符串重载函数的问题

Problem with overloading a function for literal strings

我有一个处理右值参数的模板函数。该参数应该公开一个 certian 函数。对于那些没有这个功能的右值,我需要使用模板特化来处理异常。我遇到的问题是字符串文字。这是我正在尝试做的一个简短示例。

#include <iostream>
#include <string>
using namespace std;
struct A
{
  template < class T > void foo (T && x)
  {
    x.baa();
  }
};

struct B{
    void baa(){
        cout << "I have baa()" << endl;
    };
};

template <> void
A::foo (std::string && x)
{
  cout << "I am a std::string, I don't have baa()" << endl;
};

template <> void
A::foo (char *&&x)
{
  cout << "I am a char* and I am sad because nobody ever calls me" << endl;
};


int
main ()
{
  A a;
  a.foo (B());
  a.foo (std::string ("test1"));
  
  a.foo ("test2"); // this line causes a compiler error
  
  return 0;
}

如果我尝试编译上面的代码片段,我会收到以下错误

main.cpp:16:7: error: request for member ‘baa’ in ‘x’, which is of non-class type ‘const char [6]’

16 | x.baa();

显然,编译器正在尝试应用通用函数而不是 char* 的特化。我如何编写捕获任意长度文字字符串的专业化?

请注意,"test2" 文字是一个左值,而 char *&&x 是一个右值引用,不能绑定到左值。