c++ - 如何将参数传递给函数?

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

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

最佳答案

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

例如:

&table.GetTableName ( )

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

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

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

第三个问题:EmbraceBySQuote 通过const 引用获取其参数。临时不能绑定(bind)到非 const 引用。因此,您不能将临时值传递给此函数。

第四个问题:

*detail::EmbraceBySQuote

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

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

关于c++ - 如何将参数传递给函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13318865/

相关文章:

php - 检查函数参数是否设置

r - 查找仅在 R 中的一行中出现的变量

python - *args 类型不一致

c++ - 如何处理 "Error in function boost::math::cyl_bessel_k<d>(d,d): numeric overflow"

c++ - Set-Intersection C++ 使用文本文件

java - C、C++ 和 Java 中的不同结果相同的表达式。为什么?

postgresql - AFTER INSERT PostgreSQL 触发器的意外行为

c++ - QuickFIX 处理修复消息的线程数

python - 从命令行向 python 程序传递参数,有什么比 sys.argv 更好的吗?

java - 将数组作为参数传递给类