CREATE USER test_user WITH PASSWORD 'test_password'
密码值需要单引号,用户名不需要。我只是想知道为什么会这样?两者看起来都像输入参数(字符串),但处理方式不同。
CREATE USER test_user WITH PASSWORD 'test_password'
密码值需要单引号,用户名不需要。我只是想知道为什么会这样?两者看起来都像输入参数(字符串),但处理方式不同。
这个operator()重载的例子清晰明了:
struct add_x {
add_x(int val) : x(val) {} // Constructor
int operator()(int y) const { return x + y; }
private:
int x;
};
add_x add42(42);
int i = add42(8);
assert(i == 50);
add_x add42(42)
定义一个将 42 设置为私有成员的仿函数,接下来int i = add42(8)
用 8 作为参数调用该仿函数。接下来operator()
将 42 和 8 相加并返回 50。非常棒。
然而,这个例子到底是如何工作的:
std::vector<int> v(10, 2);
// some code here
struct DivisibleBy
{
const int d;
DivisibleBy(int n) : d(n) {}
bool operator()(int n) const { return n % d == 0; }
};
if (std::any_of(v.cbegin(), v.cend(), DivisibleBy(7)))
std::cout << "At least one number is divisible by 7\n";
DivisibleBy(7)
DivisibleBy
创建一个7 设置为结构成员的实例。如何any_of()
意识到它必须传递向量值才能DivisibleBy
在此处用作谓词函数?这绝对有效:
if (std::any_of(v.cbegin(), v.cend(), [](int i) {
DivisibleBy db7 = DivisibleBy(7);
return db7(i);} ))
std::cout << "At least one number is divisible by 7\n";
我定义了一个带有显式int i
参数的内联谓词函数,该函数接收迭代器定义的值。但是,前一个示例 ( any_of(v.cbegin(), v.cend(), DivisibleBy(7))
) 没有参数来捕获迭代中的值。我假设这个
bool operator()(int n) const
是魔法发生的地方,但找不到任何明确的参考,它究竟是如何工作的?
考虑以下代码:
#include <iostream>
using f = void(std::string);
void fcorrect(f func, std::string s) {
func(s); // calling function
};
void fmistake(f func, std::string s) {
f(s); // calling type alias instead of function
};
void myprint(std::string s) {
std::cout << s << std::endl;
};
int main() {
std::string s = "message";
fcorrect(myprint, s);
fmistake(myprint, s);
return 0;
}
函数fcorrect
接收myprint
函数和字符串作为参数,并按预期打印该字符串。函数fmistake
包含一个故意的错误 - 它调用类型别名 f
而不是函数func
。它什么也不打印。
我想知道当后一个函数调用发生时,幕后发生了什么?即,为什么没有抛出编译时或运行时错误?