小编Bri*_*ian的帖子

C++类成员名称查找规则中注1是什么意思?

来自http://eel.is/c++draft/class.member.lookup#1

搜索在范围X为名称N从程序点P是在单个搜索X用于NP除非X是一个类或类模板的范围T,在这种情况下,下面的步骤定义搜索的结果。

[注 1:结果只有在N转换函数 id或单次搜索找不到任何东西时才会有所不同。—尾注]

我很难理解 Note。似乎从类范围中进行“单一搜索”会在名称空间范围内找到前面的声明,因为名称空间范围包含类范围。但是,正如我们所知,如果名称也被声明为非依赖基类的成员,则基类成员优先于命名空间成员。Note 1似乎与此相矛盾,因为它基本上是在说“如果N不是转换函数 ID,那么您可以只进行普通的单一搜索,并且只有在找不到任何内容时,才使用本节中的过程”。但是单次搜索将通过找到命名空间范围声明而成功,而类成员查找将产生不同的结果。

我的理解错误在哪里?

c++ language-lawyer c++23

7
推荐指数
1
解决办法
158
查看次数

空指针常量初始化:哪种行为是正确的?

int main() {
    const int x = 0;
    int* y = x;   // line 3
    int* z = x+x; // line 4
}
Run Code Online (Sandbox Code Playgroud)

标准(C++11§4.10/ 1)

空指针常数是整数表达式(5.19),用于评估至零或类型的prvalue整数类型的prvalue std::nullptr_t.空指针常量可以转换为指针类型; ...

有四种可能性:

  1. 第4行没问题,但第3行没有.这是因为x并且x+x都是常量表达式,其值为0,但只是x+x一个prvalue.似乎gcc采用了这种解释(现场演示)

  2. 第3行和第4行都可以.虽然x是左值,但是应用了左值到右值的转换,使得prvalue常量表达式等于0.我的系统上的clang(clang-3.0)接受第3行和第4行.

  3. 第3行和第4行都不正常.clang-3.4两行错误(现场演示).

  4. 第3行没问题,但第4行没有.(包括为了完整性,即使我尝试的编译器没有表现出这种行为.)

谁是对的?是否取决于我们正在考虑的标准版本?

c++ pointers language-lawyer c++11

6
推荐指数
1
解决办法
278
查看次数

如何初始化类C++的成员const向量

我有一个const向量作为类中的成员.我该如何初始化它?

我知道对于常量成员,我们初始化它们的唯一方法是通过类的构造函数的列表初始化.但究竟如何用矢量来做,我不知道.

例如,

class ClassA
{

const std::vector<int> m_Vec;


};
Run Code Online (Sandbox Code Playgroud)

谢谢

c++ vector

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

"gcc链接"和"ld链接"之间的关系是什么?

据说linux加载器是/ usr/bin/ld,但通常我们使用gcc/g ++来链接库和可执行文件,我们几乎不使用"ld".

我最后一次手动使用"ld"是在学习linux程序集时,生成可执行文件的唯一方法是使用.d文件直接生成可执行文件而不需要任何库.

我的问题是,gcc/g ++是否包含一些"ld"的函数包装器,因为原始的"ld"太难用了?或者我们不应该明确地使用"ld"进行c/c ++程序链接,因为blablabla?

非常感谢.

c++ linux gcc ld

6
推荐指数
1
解决办法
2030
查看次数

Does std::integral_constant&lt;T, v&gt;::value always have a definition?

In the C++14 standard, the std::integral_constant template is defined as follows:

template <class T, T v>
struct integral_constant {
  static constexpr T value = v;
  typedef T value_type;
  typedef integral_constant<T,v> type;
  constexpr operator value_type() const noexcept { return value; }
  constexpr value_type operator()() const noexcept { return value; }
};
Run Code Online (Sandbox Code Playgroud)

It doesn't say whether there's a corresponding out-of-line definition for the static data member, i.e.,

template <class T, T v>
constexpr T integral_constant<T, v>::value;
Run Code Online (Sandbox Code Playgroud)

I looked through the standard …

c++ c++14

6
推荐指数
1
解决办法
182
查看次数

所有IRC服务器都发送005 RPL_ISUPPORT吗?

此数字不是RFC 1459的一部分,但我希望能够使用它来正确堆叠和取消堆叠IRC机器人中的模式.有没有主流的IRC服务器不发送这个?

irc

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

为什么gcc需要gmp?

任何曾经从源代码构建过gcc的人都知道,gmp是gcc的依赖.为什么是这样?换句话说,gcc实际上用它做什么?

gcc gmp

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

为什么值初始化如此命名?

我真的不清楚为什么有人会命名一种特定形式的初始化"值初始化".这听起来就像它的给它的值初始化对象......但是这就是初始化不一般,而且名称不告诉你任何关于珍惜它要使用的初始化.

c++ initialization value-initialization

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

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

所以,我有一个根进程(以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
查看次数

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

考虑以下代码:

#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
查看次数