传递空字符串以作为参数

时间:2017-05-19 23:31:07

标签: c++

在不创建变量的情况下将NULL字符串传递给函数的正确方法是什么? 我看到以下代码的编译错误,我不想更改定义。也可能需要对字符串进行更改,因此不要将其标记为常量类型。

#include <iostream>
#include <string>

using namespace std;
void
myfunc(int i,  string &my) {
   if (my.empty()) {
      cout << "Empty" << endl;
   } else {
      cout << "String is " << my <<endl;
   }
}
int main ()
{
  std::string str1 ("Test string");
  myfunc(1, str1);
  std::string str2 ("");
  myfunc(2, "");
  return 0;
}`

my1.cpp:18:错误:从'const char *'类型的临时值初始化'std :: string&amp;'类型的非const引用无效 my1.cpp:6:错误:传递'void myfunc(int,std :: string&amp;)的参数2 “

编译后但我不想创建局部变量

#include <iostream>
#include <string>

using namespace std;
void
myfunc(int i,  string &my) {
   if (my.empty()) {
      cout << "Empty" << endl;
   } else {
      cout << "String is " << my <<endl;
   }
}
int main ()
{
  std::string str1 ("Test string");
  myfunc(1, str1);
  std::string str2 ("");
  myfunc(2, str2);
  return 0;
} 

2 个答案:

答案 0 :(得分:3)

这里的解决方案是让一个没有字符串参数的重载。

void myfunc(int i,  string &my) {
      cout << "String is " << my <<endl;
}

void myfunc(int i) {
   cout << "Empty" << endl;
}

int main ()
{
  std::string str1 ("Test string");
  myfunc(1, str1);
  myfunc(2);
}

这是最简单明了的解决方案,可以准确传达您的意图和功能。

你不应该试图按照你的方式去做,因为如果你想修改参数,那么参数应该是“非const引用”,所以它不能绑定到临时对象。因此,您无法将字符串文字传递给它。

如果你想明确表示你没有传递一个字符串,你可以创建一个标签ala nullptr,虽然我不建议在上面的变体是清楚的并且每个人都能理解的时候有额外的复杂性。乍一看。

struct no_string_tag_t {};
constexpr no_string_tag_t no_string_tag;

void myfunc(int i,  string &my) {
      cout << "String is " << my <<endl;
}

void myfunc(int i, no_string_tag_t) {
   cout << "Empty" << endl;
}

int main ()
{
  std::string str1 ("Test string");
  myfunc(1, str1);
  myfunc(2, no_string_tag);
}

如果你真的想要一个单一的函数,那么语义正确的版本将有一个可选的引用。

auto foo(int i, std::optional<std::reference_wrapper<std::string>> my)
{
    if (my)
        cout << "String is " << my <<endl;
    else
        cout << "no string" << endl;

}
int main ()
{
  std::string str1 ("Test string");
  myfunc(1, str1);
  myfunc(2, std::nullopt);
}

如果你想保留功能签名并且仍然可以暂时传递它,那么你就不走运了。 C++具有一个安全功能,因为它不允许非const lreferece绑定到临时。这种限制的原因是,尝试通过引用来修改临时文件很可能是错误,而不是程序员的意图,因为临时终止了。

答案 1 :(得分:0)

您无法将临时参数传递给非const参数。作为临时对象,一旦函数返回就会被销毁。函数对该对象所做的任何更改都将丢失。

如果您希望有机会修改字符串,可以通过const引用获取字符串并返回修改后的字符串。

string myfunc( int i, string const &s );
:
str1 = myfunc( 1, str1 );
auto result2 = myfunc( 2, "" );

您的另一个选择是使用指向可以为null的字符串的指针。

void myfunc( int i, string *s ) {
    if (!s) {
        cout << "Empty" << endl;
    } else {
        cout << "String is " << *s <<endl;
    }
}

myfunc( 1, &str1 );
myfunc( 2, nullptr );