小编Bri*_*ian的帖子

为什么班次的优先级低于C中的加法和减法?

在进行位操作时,我有时会觉得这很不方便(虽然我现在不记得任何具体的例子).我也发现它在概念上令人困惑,因为移位基本上是乘法和除以2的幂.

我在C++中看到它很方便,当使用<<将输出发送到ostream时,但当然不能用于解释订单最初是如何在C中修复的.

c operator-precedence

5
推荐指数
1
解决办法
285
查看次数

以另一个用户身份加载流程?

所以,我有一个根进程(以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 java unix linux

5
推荐指数
1
解决办法
274
查看次数

当长度未知时,是否可以使用libtiff解码CCITT编码的数据?

在这个问题的答案中:c ++解码pdfs中的CCITT编码图像

需要指出的是,libtiff可用于解码CCITT编码的图像.当然,我们必须预先添加一个TIFF标头,以使CCITT流成为有效的TIFF文件.

但是,PDF文件中的某些图像是内嵌图像,虽然给出了宽度,高度和位深度,但未给出它们的长度.读取PDF的程序应该解码CCITT流,读取(宽度*高度*深度)位的解码数据,以及读取数据后的任何位置,这是内联图像的结束.然后它应该继续下一页标记命令,依此类推.

这带来了一个问题.TIFF图像文件目录必须指定图像数据的每个条带中有多少字节,但在我们解码之前我们不知道编码数据的实际属于多少字节,但我们不能不使用libtiff解码图像...

有没有办法在这里使用libtiff或我们需要自定义CCITT过滤器代码?

pdf tiff

5
推荐指数
1
解决办法
492
查看次数

C++依赖名称:是否需要此类型名称?

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 GroupNodeb.cpp.取消注释typename可以驯服Clion警告,但我想知道这是否typename是必需的?如果是这样,为什么g ++/clang ++没有发出任何警告?

c++ templates dependent-name language-lawyer

5
推荐指数
1
解决办法
196
查看次数

当需要用户定义的转换时,左值和右值引用参数之间的重载解析

考虑以下代码:

#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如果

...

  • S1S2是引用绑定 (11.6.3),两者都不引用未使用ref-qualifier声明的非静态成员函数的隐式对象参数,并且S1将右值引用绑定到右值并S2绑定左值引用

...

因此,有关左值和右值引用绑定的决胜局仅适用于标准转换序列。但是需要用户定义的f转换序列才能调用给定int参数的任一重载。用户自定义转换序列的排序规则为(3.3),

如果用户定义的转换序列U1包含相同的用户定义的转换函数或构造函数,或者它们在聚合初始化中初始化相同的类,并且在这两种情况下,第二个标准转换序列是,则用户定义的转换序列是U2比另一个用户定义的转换序列更好的转换序列U1优于 的第二个标准转换序列U2

显然,两个转换序列(toconst …

c++ overload-resolution

5
推荐指数
0
解决办法
94
查看次数

C ++中“依赖名称”的定义是什么?

在 C++ 中,依赖名称的概念很重要,因为:

这样的名称是未绑定的,并且在模板实例化的点上查找……在模板定义的上下文和实例化点的上下文中

但是,该标准唯一说的是在[temp.dep]/2 中给出了依赖名称,指的是不合格的函数调用,基本上是为了使 ADL 能够对那些函数调用完全有效。

除了这些外,还有其他依赖名称吗?

考虑一些这样的代码,例如:

template <class T>
void foo(T t) {
    t.bar();
};
Run Code Online (Sandbox Code Playgroud)

如果有人将其bar称为“从属名称” ,根据标准,这是否在技术上不正确地使用该术语?

c++ templates dependent-name language-lawyer name-lookup

5
推荐指数
1
解决办法
159
查看次数

如果函数模板已经推导出返回类型,有没有办法在不实例化定义的情况下调用它?

考虑一些函数模板,例如:

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>可以在不会实例化其定义的未计算表达式中调用吗?

c++ templates language-lawyer

5
推荐指数
1
解决办法
127
查看次数

如何理解“明显恒定评估”的定义?

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。

我应该如何理解标准中的定义,使其具有与提案意图一致的准确含义?

c++ language-lawyer c++20

5
推荐指数
1
解决办法
135
查看次数

什么是gcc 4.1.3?

根据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的源代码,以便我可以在我的系统上重建它?

ubuntu gcc

4
推荐指数
1
解决办法
634
查看次数

如何在D中声明私有类成员?

该程序将回显"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)

d compiled-language private-members

3
推荐指数
1
解决办法
83
查看次数