在进行位操作时,我有时会觉得这很不方便(虽然我现在不记得任何具体的例子).我也发现它在概念上令人困惑,因为移位基本上是乘法和除以2的幂.
我在C++中看到它很方便,当使用<<将输出发送到ostream时,但当然不能用于解释订单最初是如何在C中修复的.
所以,我有一个根进程(以root身份运行),我希望它使用非root uid加载另一个进程.
此刻,我正在调用seteuid,setegid然后在创建进程后重置为root.我发现该进程仍然使用root的uid加载.我该怎么用呢?
Java代码(JNA):
public boolean loadVHost(String java, File sockfile) throws IOException {
if (CLib.INSTANCE.setegid(suid) != 0) {
log("setegid C call failed! @ " + id);
return false;
}
if (CLib.INSTANCE.seteuid(suid) != 0) {
log("seteuid C call failed! @ " + id);
return false;
}
if (CLib.INSTANCE.getegid() != suid || CLib.INSTANCE.geteuid() != suid) {
log("geteuid/egid C call returned unwanted value! @ " + id + " (returned " + CLib.INSTANCE.getuid() + ":" + CLib.INSTANCE.getgid() + ")"); …Run Code Online (Sandbox Code Playgroud) 在这个问题的答案中:c ++解码pdfs中的CCITT编码图像
需要指出的是,libtiff可用于解码CCITT编码的图像.当然,我们必须预先添加一个TIFF标头,以使CCITT流成为有效的TIFF文件.
但是,PDF文件中的某些图像是内嵌图像,虽然给出了宽度,高度和位深度,但未给出它们的长度.读取PDF的程序应该解码CCITT流,读取(宽度*高度*深度)位的解码数据,以及读取数据后的任何位置,这是内联图像的结束.然后它应该继续下一页标记命令,依此类推.
这带来了一个问题.TIFF图像文件目录必须指定图像数据的每个条带中有多少字节,但在我们解码之前我们不知道编码数据的实际属于多少字节,但我们不能不使用libtiff解码图像...
有没有办法在这里使用libtiff或我们需要自定义CCITT过滤器代码?
在a.hpp我定义:
#include <utility>
namespace Board {
template<int W, int H>
struct GroupNode
{
using PointType = std::pair<int, int>;
// ...
};
}
Run Code Online (Sandbox Code Playgroud)
然后,在b.cpp我定义:
#include "a.hpp"
namespace Board {
template<int W, int H>
struct NodeList
{
using StdList = std::list < /* typename */ GroupNode<W, H>>;
}
}
// and then use NodeList<19, 19> nl;
Run Code Online (Sandbox Code Playgroud)
上面的代码可以在gcc-6和clang-3.9上编译而不会发出任何警告.然而,克利翁2016.3抱怨cannot resolve variable GroupNode在b.cpp.取消注释typename可以驯服Clion警告,但我想知道这是否typename是必需的?如果是这样,为什么g ++/clang ++没有发出任何警告?
考虑以下代码:
#include <cstdio>
struct S {
S(int) {}
};
void f(const S&) { std::puts("const S&"); }
void f(S&&) { std::puts("S&&"); }
int main() {
f(42);
}
Run Code Online (Sandbox Code Playgroud)
很明显,GCC 和 Clang 都同意应该调用重载S&&,但我对标准的解读是,实际上没有规则要求这种情况!
当然,您会说调用f必须初始化一个临时S对象,并且重载解析更喜欢将右值引用绑定到右值而不是绑定左值引用。然而,这就是标准在 [over.ics.rank]/(3.2) 中实际所说的内容:
标准转换序列
S1是比标准转换序列更好的转换序列,S2如果...
S1和S2是引用绑定 (11.6.3),两者都不引用未使用ref-qualifier声明的非静态成员函数的隐式对象参数,并且S1将右值引用绑定到右值并S2绑定左值引用...
因此,有关左值和右值引用绑定的决胜局仅适用于标准转换序列。但是需要用户定义的f转换序列才能调用给定int参数的任一重载。用户自定义转换序列的排序规则为(3.3),
如果用户定义的转换序列
U1包含相同的用户定义的转换函数或构造函数,或者它们在聚合初始化中初始化相同的类,并且在这两种情况下,第二个标准转换序列是,则用户定义的转换序列是U2比另一个用户定义的转换序列更好的转换序列U1优于 的第二个标准转换序列U2。
显然,两个转换序列(toconst …
在 C++ 中,依赖名称的概念很重要,因为:
这样的名称是未绑定的,并且在模板实例化的点上查找……在模板定义的上下文和实例化点的上下文中
但是,该标准唯一说的是在[temp.dep]/2 中给出了依赖名称,指的是不合格的函数调用,基本上是为了使 ADL 能够对那些函数调用完全有效。
除了这些外,还有其他依赖名称吗?
考虑一些这样的代码,例如:
template <class T>
void foo(T t) {
t.bar();
};
Run Code Online (Sandbox Code Playgroud)
如果有人将其bar称为“从属名称” ,根据标准,这是否在技术上不正确地使用该术语?
考虑一些函数模板,例如:
template <class T>
const auto& foo() { static T t; return t; }
Run Code Online (Sandbox Code Playgroud)
如果T是 ,则定义将无效void。尽管如此,我们可以单独实例化声明而不触发错误:
extern template const auto& foo<void>(); // explicit instantiation declaration
Run Code Online (Sandbox Code Playgroud)
现在让我们考虑foo被调用而不是被显式实例化的情况。显然,如果foo在评估的上下文中被调用,特化的定义将被实例化。在未评估的情况下呢?我们知道,如果在未计算的上下文中调用具有非推导返回类型的函数模板,则不会实例化特化的定义。一个明显的例子是std::declval<T>. 尚不清楚对于具有推导返回类型的函数是否可能相同。
例如,我考虑过这个:
static_assert(sizeof( (void)foo<void>(), char{} ) == 1);
Run Code Online (Sandbox Code Playgroud)
然而,即使在这种情况下,编译器肯定有足够的信息来评估sizeof表达式而不知道返回类型,编译错误仍然会发生(godbolt link)。
foo<void>在这种情况下,标准的哪些规定需要实例化的定义?foo<void>可以在不会实例化其定义的未计算表达式中调用吗?P0595介绍了该std::is_constant_evaluated()功能。本文讨论了在某些情况下包含表达式是常量表达式,但编译器不需要在编译时评估的情况。给出的例子是:
constexpr double power(double b, int x) {
if (std::is_constant_evaluated() && x >= 0) {
// ...
// return r;
} else {
// Let the code generator figure it out.
return std::pow(b, (double)x);
}
}
double thousand() {
return power(10.0, 3);
}
Run Code Online (Sandbox Code Playgroud)
编译器可以power(10.0, 3)在编译时进行评估,但不是必需的。因此,is_constant_evaluated返回false。
因此,论文引入了“明显常量评估”的概念:
我们的方法是精确识别一组“明显常量评估”(一个新的技术短语)的表达式,并指定我们的新函数
true在评估此类表达式期间返回,false否则返回。具体来说,我们在“明显常量评估”的表达式集中包含两种表达式。第一种很简单:标准已经要求常量结果的上下文中的表达式,例如数组的维数或 constexpr 变量的初始值设定项。...
这对我来说很有意义。然而,标准中的实际措辞让我感到困惑:
一个表达式或转换显然
e是常量求值的,如果它是:
- 一个常量表达式,或...
换句话说,标准规定所有常量表达式都明显是常量计算的,这(对我来说)似乎没有包含表达式出现在需要常量表达式的上下文中的要求。提案备注power(10.0, 3)是核心不变的表达,也是我的理解;这使它成为一个常量表达式。如果所有常量表达式都显然是常量计算的,那么这里似乎is_constant_evaluated必须返回 true。
我应该如何理解标准中的定义,使其具有与提案意图一致的准确含义?
根据gcc发布页面http://www.gnu.org/software/gcc/releases.html,版本4.1.3不存在.
但是,我已经看过各个地方提到的版本.(例如,只是进行谷歌搜索.)我也清楚地记得4.1.3是我在旧版Ubuntu发行版中的版本,而4.1.3是我仍然拥有的chroot jail中运行的版本.
那4.1.3 是什么?更重要的是,它与4.1.2有什么不同,我如何获得4.1.3的源代码,以便我可以在我的系统上重建它?
该程序将回显"C".我怎么不允许这样做?
import std.stdio;
void main() {
class A {
private void B() {
writeln("C");
}
}
auto D = new A;
D.B();
}
Run Code Online (Sandbox Code Playgroud)