注意:为澄清起见,问题不是restrict一般地使用关键字,而是具体地将关键字应用于此处所述的成员函数。
gcc允许您在成员函数上使用__restrict__(相当于C99的GNU ++ restrict)限定符,从而有效地this在函数范围内创建了限定限定的指针。牛肉在哪里?
大多数成员函数上的其他成员的工作,通过访问它们this,这是一个T* const(并且通常非混淆)。为了this可能被别名,在成员函数内将需要使用第二个指向类型的指针,并且它必须来自某个地方。
这是非成员函数经常发生的情况,例如所有二进制运算符或采用至少两个相同或非平凡类型的指针或引用的其他自由函数。但是,这些函数没有this,因此它们不相关。
赋值运算符,拷贝构造,和一元比较运算符,其中的成员函数的实例this 可以 在原则上被混叠(因为另一个目的通过引用传递)。因此,给它们分配一个限制限定符才是真正有意义的-编译器应该已经清楚所有其他函数仍然具有限制属性(因为永远不会有第二个指向T的指针)。
现在,例如,如果你用restrict的operator=你应该必然不检查所有自赋值,因为你说this是不是该函数的范围内的别名(以及如果这是真的,没有自我的分配也可能会发生)。
显然,这是您可能无法事先知道的,也是没有意义的。
那么,在一种情况下,人们实际上想给成员函数一个限制限定符,并且有意义吗?
是否有一个文件名可以分配给一个变量(即不是一个神奇的内置 shell 令牌&1),让我重定向到stdout?
我最终想要做的是在 cron 脚本中运行这样的东西:
LOG=/tmp/some_file
...
some_command 2>&1 >> $LOG
echo "blah" >> $LOG
...
Run Code Online (Sandbox Code Playgroud)
方便的是,这让我可以通过重定向到/dev/null稍后,当我确定没有任何可能失败(或者,至少,没有我关心的事情!)而不重写整个脚本时关闭日志噪音。是的,关闭日志记录并不是最好的做法——但是一旦这个脚本运行起来,就不会有太多可以想象的错误,并且不需要用没有人想要阅读的兆字节日志信息来破坏磁盘。
如果 5 年后出现意外故障,仍然可以通过拨动开关再次打开日志记录。
另一方面,在编写和调试脚本(包括从 shell 手动调用它)时,如果它可以将输出转储到控制台,那就太好了。这样我就不需要tail手动记录日志文件了。
换句话说,我正在寻找类似于/proc/self/fd/0bash-talk 的东西,我可以将其分配给LOG. 碰巧,/proc/self/fd/0在我的 Linux 机器上工作得很好,但我想知道 bash 中是否已经内置了这样的东西(这通常是可取的)。
我很惊讶,为类似函数的宏提供一个带有两个模板参数的类型会导致编译器抱怨.
这个(概念上类似的)示例代码:
template<typename T> struct foo{};
template<typename T, U> struct bar{};
#define p(x) printf("sizeof(" #x ") = %u\n", sizeof(x));
int main()
{
p(foo<int>); // works, of course
p(bar<int,int>); // does not work
p((bar<int,int>)); // does not work either
return 0;
}
Run Code Online (Sandbox Code Playgroud)
让GCC(6.2.0)抱怨macro "p" passed 2 arguments, but takes just 1.
当然,预处理器是一个执行文本替换的预处理器,它不是真正的C++编译器,它可以理解模板或该语言的所有其他规则.
也许我通过期待预处理器识别尖括号而给出太多要求,但是至少在规范中明确提到了括号.
16.3(第10至12段)规定了最外面的括号,用于界定有界的令牌序列."最外层"一词表示预处理器可能还有其他(非最外层)括号.
此外,它明确指出"跳过中间匹配的左右括号对"以及"匹配内括号之间的逗号预处理标记不分离参数" - 这意味着如果我正确读取,那么至少最后一行应该在我的理解传递.
我理解错了什么?
在Visual Studio中,我下载了最新版本的MySql连接器,但是当我尝试输入凭据并选择数据库时,在我甚至可以执行此操作之前,它说:
"不再支持使用旧密码进行身份验证,请使用4.1样式密码"
我正在使用Hostgator,我向他们提交了一张票,询问他们该怎么做.他说最好的解决方案是升级所有客户端程序以使用4.1.1版本.
这是什么意思?客户端有什么东西可以升级吗?Mysql和PHP是服务器端,我认为主机gator将负责所有这些.
就Mysql连接器而言,我使用的是6.6.5版本.有任何想法吗?
在强类型枚举中无条件要求显式范围解析背后的基本原理是什么?
N2347解释了旧时枚举的不同之处,即缺少隐式转换,指定存储类型的能力,以及周围范围内没有注入名称(如C++ 03,它将其作为C的遗产).
换句话说,enum E1 { a, b, c};在C++ 03中编写类似于编写
const int a = 1; const int b = 2; const int c = 3;
Run Code Online (Sandbox Code Playgroud)
而enum E1 class { a, b, c};在C++中,11更像是类似的东西
namespace E1 { const int a = 1; const int b = 2; const int c = 3; }
Run Code Online (Sandbox Code Playgroud)
(不引入命名空间,并在任何一种情况下定义枚举类型).
现在,我通常不明白哪里有歧义,假设有一个例如下面的代码(不会编译):
enum class E1 { a, b, c };
enum class E2 { a, b, c }; // allowed now
void foo(E1 e) { …Run Code Online (Sandbox Code Playgroud) 我无法使用CreateFileAPI 在Windows中创建文件,GetLastError返回错误代码80,这意味着文件存在,但实际上文件不存在.
hFile = CreateFile((LPCTSTR) FILEPATH, // name of the write
GENERIC_READ|GENERIC_WRITE, // open for writing
0, // do not share
NULL, // default security
CREATE_ALWAYS, // create new file only
FILE_ATTRIBUTE_NORMAL, // normal file
NULL); // no attr. template
printf("GET LAST ERROR VALUE IS: %d\n", GetLastError());
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
在包含另一个模板类的模板类(什么重要的...可更换存储表示什么),我认为这不是在serveral的模板参数传递下来,那将是更优雅中的一个实例来传递内模板和参数达到了再次来代替.
为什么不!当然这很有效,而且更优雅!
现在,也许上面的内容有点难以理解,所以让我们看看我一直在努力做的一些(几乎可编译的)代码:
template<typename T, int n> struct foo
{
// using alias_of_T = T;
};
template<typename FOO> struct bar
{
FOO _foo;
// this works just fine!?
static constexpr int size = FOO::n;
// this indeed works, but... bleh
// using type_t = typename FOO::alias_of_T;
// this does not work?
using type_t = typename FOO::T;
type_t whatever() { return ...; }
};
//...
int main()
{
bar<foo<int, 3>> zoo;
...
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,FOO模板参数T无法访问.但更令人惊讶的是,完全可以访问 …
任何人都可以告诉我如何在不使用字符串函数的情况下找到给定字符串中子字符串的出现次数.例如,字符串是" 当男人得到母鸡 "时,我预期的结果是子串' 他 ' 在给定的字符串中出现4次.
使用递归如何更新局部变量直到满足条件.我在下面有一个实例解释了为什么问题很好.count变量是一个局部变量,并且方法经过计数的时间设置为0.我不能将方法移动到方法之外它必须是局部变量而不是静态或其他任何东西..所需的输出应该是(3 6) )
public static int returnInt(int b) {
int count = 0;
if (b == 6) {
System.out.println(count + " " + b);
}
b += 2;
count++;
return returnInt(b);
}
Run Code Online (Sandbox Code Playgroud) 我file1在服务器1和file2服务器2 上有两个文件.
现在我想写一个脚本来将file2(从服务器2)的内容附加到file1(在服务器1上),也就是说,不覆盖原始内容.
如何使用shell脚本(使用Ubuntu Linux)执行此操作?
可能这个问题非常简单,但我是Ocaml编程语言的初学者.我在网上找到了一个用Ocaml编写的解释器,用于WHILE语言.更确切地说,我有5个.ml文件实现:
我如何使用这些文件?例如,如果我想运行用WHILE语言编写的程序,那么我该怎么办?
我试图编译(ocamlc -c file.ml)我有的文件,但没有成功.
我正在使用安装了ocaml软件包的ubuntu.