如何将参数传递给函数?

时间:2012-11-10 03:11:53

标签: c++ function arguments

我有一个问题,如何使用较少的局部变量和符号(例如“*”,“&”

)使代码更具可读性

当我写这样的东西时:

inline std::string&
EmbraceBySQuote (
            std::string& str ) {
    str = "'" + str + "'";
    return str;
}  /* -----  end of function EmbraceBySQuote ----- */

我不能做这样的事情

fmter % ( *detail::EmbraceBySQuote ( &table.GetTableName ( ) ) );
table.GetTableName ( ) //returns std::string

我收到错误

invalid initialization of non-const reference of type ... from a temporary of type rvalue ...

与指针相同

inline std::string*
EmbraceBySQuote (
            std::string* str ) {
    *str = "'" + *str + "'";
    return str;
}  /* -----  end of function EmbraceBySQuote ----- */


fmter % ( *detail::EmbraceBySQuote ( &table.GetTableName ( ) ) );

taking address of temporary 

所以我需要这样的东西

std::string tableName = table.GetTableName ( );
fmter % ( *detail::EmbraceBySQuote ( &tableName ) );

如果没有创建新变量并使用引用,您知道如何使其更简单吗?

2 个答案:

答案 0 :(得分:2)

你的代码背叛了对......很多东西缺乏了解。

例如:

&table.GetTableName ( )

如您所述,table.GetTableName()会返回std::string。据推测,这是一个值。这意味着它正在返回一个临时的。

所以第一个问题:你不能拿一个临时的地址。所以&table.GetTableName()不是合法的C ++代码。您不需要&

第二个问题:即使你可以获取临时地址,EmbraceBySQuote也不会使用指针。它需要引用。引用和指针是不同的东西。您不能将指针传递给期望引用的函数(除非它是对指针的引用)。

第三个问题:EmbraceBySQuote通过const 引用获取其参数。临时无法绑定到非const引用。所以你不能将临时函数传递给这个函数。

第四个问题:

*detail::EmbraceBySQuote

引用不是指针,因此您无法取消引用

你需要停下来然后回到intro-to-C ++并从那里开始。关于引用和指针的基本C ++原则,你有一些非常混乱的想法。你需要解决这个问题。

答案 1 :(得分:1)

table.GetTableName()可能会返回const std::string&,或者更有可能返回const char*因此,编译器必须设法将临时std :: string传递给{ {1}},并且编译器设计的临时值不能作为非const引用传递(您的编译器可能支持它,但如果它是非标准的话,则它是非标准的。)

您可以通过多种方式解决此问题,其中一种方法如下所示:

EmbraceBySQuote

注意:这些不会就地修改in-parameter。如果这是您想要的结果,您必须自己分配结果。

inline std::string EmbraceBySQuote(const char* str)
{
    std::string ans = str;
    ans.insert(ans.begin(), '\'');
    ans.push_back('\'');
    return ans;
}

inline std::string EmbraceBySQuote(const std::string& str)
{
    std::string ans = "'" + str + "'";
    return ans;
}