0

我有一个问题,如何使用更少的局部变量和符号(如“*”、“&”)使代码更具可读性

当我写这样的东西时:

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 ) );

您知道如何在不创建新变量和使用引用的情况下使其更简单吗?

4

2 回答 2

2

您的代码暴露出对……很多事情缺乏理解。

例如:

&table.GetTableName ( )

正如您所说,table.GetTableName()返回一个std::string. 大概这是返回一个值。这意味着它正在返回一个临时的。

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

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

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

第四个问题:

*detail::EmbraceBySQuote

引用不是指针,因此您不能取消引用它。

您需要停下来回到 C++ 入门并从那里开始。您对引用和指针的基本 C++ 原则有一些非常困惑的想法。你需要解决这个问题。

于 2012-11-10T03:44:01.310 回答
1

很可能table.GetTableName()返回 aconst std::string&或更可能返回 aconst char*结果,编译器必须设计一个临时 std::string 来传递给EmbraceBySQuote,并且编译器设计的临时对象不能作为非常量引用传递(您的编译器可能支持它,但如果它是非标准的)。

有多种方法可以解决此问题,下面列出了其中一种:

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;
}

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

std::string foo = "foo";
foo = EmbraceBySQuote(foo);
于 2012-11-10T03:31:06.257 回答