小编eca*_*mur的帖子

什么是"从这里需要"的错误

它位于我的Eclipse Problems视图中.代码编译正常,但有一个错误说" required from here",指向一些提升头文件和行state_data const current_state=interlocked_compare_exchange(&state,new_state,old_state);

我不喜欢有错误或警告.有人知道那是什么吗?

c++ eclipse mingw

9
推荐指数
1
解决办法
2万
查看次数

在另一个静态对象的析构函数中构造的静态对象的析构函数

我在下一个代码中遇到了析构函数的一些问题:

#include <stdlib.h>
#include <cstdio>

class Foo2
{
    public:
        Foo2() { printf("foo2 const\n"); }

        ~Foo2()
        {
            printf("foo2 dest\n"); //  <--- wasn't called for bionic libc
        }
};

static Foo2& GetFoo2()
{
    static Foo2 foo2;
    printf ("return foo2\n");
    return foo2;
}

class Foo1
{
    public:
        Foo1() { printf("foo1 const\n"); }

        ~Foo1()
        {
            printf("foo1 dest\n");
            GetFoo2();
        }
};

int main( int argc, const char* argv[] )
{
        printf("main 1 \n");
        static Foo1 anotherFoo;
        printf("main 2 \n");
}
Run Code Online (Sandbox Code Playgroud)

为什么不要求foo2的析构函数bionic用于glibc? …

c++ oop static destructor g++

8
推荐指数
2
解决办法
482
查看次数

SFINAE:'static_cast <void>()'或',void()'?

在任意类型上执行SFINAE时,通常需要将表达式的结果转换为void.我已经看到了两种方法; 演员无效:

(void)(expr)    // or static_cast<void>(expr)
Run Code Online (Sandbox Code Playgroud)

或者,使用带有void prvalue RHS的逗号运算符:

(expr), void()
Run Code Online (Sandbox Code Playgroud)

我的理解是,在两种情况下都要expr评估(对于良好的形式,在非评估的上下文中)和结果(或结果类型,在非评估的上下文中)被丢弃; 在任何一种情况下,即使是病理类也不可能T覆盖T::operator void()operator,(T, void).(参见:为什么是"运营商无效"不投语法调用?,什么的'无效()'中的'自动F(PARAMS) - > decltype(...,无效())'呢?).

也就是说,这两个成语是等价的,还是在某种情况下,一个人应该优先于另一个(可能是非标准的编译器)?如果没有,是否有任何理由(例如可理解性)偏好一个而不是另一个?

c++ void decltype sfinae

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

如何编写丢弃其参数的通用可变参数lambda?

我想写一个lambda,它通过通用引用获取任意数量的参数,并完全忽略它们.显而易见的方法是使用可变参数通用参数包的语法并省略参数名称:

auto my_lambda = [](auto&&...) { return 42; };
Run Code Online (Sandbox Code Playgroud)

这工作正常(使用gcc 4.9.2),直到我尝试传递一个非平凡的可复制对象:

struct S { S() {} S(S const&) {} };
my_lambda("meow", 42, S{});
^ error: cannot pass objects of non-trivially-copyable type 'struct S' through '...'
Run Code Online (Sandbox Code Playgroud)

这是怎么回事?我的代码是不正确的,还是gcc中的错误?

在任何一种情况下,最好的解决方法是什么?我发现命名参数有效,但后来我遇到了一个未使用的参数警告:

auto my_lambda = [](auto&&... unused) { return 42; };
^ error: unused parameter 'unused#0' [-Werror=unused-parameter]
^ error: unused parameter 'unused#1' [-Werror=unused-parameter]
^ error: unused parameter 'unused#2' [-Werror=unused-parameter]
Run Code Online (Sandbox Code Playgroud)

如何在模板参数包上抑制未使用的参数警告?

c++ lambda variadic unused-variables c++14

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

是否可以通过列表初始化来调用用户定义的转换函数?

这个程序合法吗?

struct X { X(const X &); };
struct Y { operator X() const; };

int main() {
  X{Y{}};   // ?? error
}
Run Code Online (Sandbox Code Playgroud)

n2672之后,经过缺陷978的修正,13.3.3.1 [over.best.ics]具有:

4 - 但是,当初始化列表只有一个元素并且转换为某个类X时,在考虑构造函数或用户定义的转换函数的参数时,它是13.3.1.7 [...]的候选者.或者引用(可能是cv-qualified)X被认为是X [...]的构造函数的第一个参数,只考虑标准转换序列和省略号转换序列.

这看起来很不正常; 它的结果是使用列表初始化强制转换指定转换是非法的:

void f(X);
f(Y{});     // OK
f(X{Y{}});  // ?? error
Run Code Online (Sandbox Code Playgroud)

据我所知n2640,列表初始化应该能够替换直接初始化和复制初始化的所有用法,但是似乎没有办法只使用list-initialization X从类型的对象构造一个类型的对象Y:

X x1(Y{});  // OK
X x2 = Y{}; // OK
X x3{Y{}};  // ?? error
Run Code Online (Sandbox Code Playgroud)

这是标准的实际意图吗?如果没有,它应该如何阅读或阅读?

c++ implicit-conversion c++11 list-initialization

6
推荐指数
2
解决办法
555
查看次数

trailing-return-type中的占位符是否会覆盖初始占位符?

克++出现接受的任何组合autodecltype(auto)作为初始和结尾返回类型:

int a;
auto f() { return (a); }                             // int
auto g() -> auto { return (a); }                     // int
auto h() -> decltype(auto) { return (a); }           // int&
decltype(auto) i() { return (a); }                   // int&
decltype(auto) j() -> auto { return (a); }           // int
decltype(auto) k() -> decltype(auto) { return (a); } // int&
Run Code Online (Sandbox Code Playgroud)

但是,clang拒绝j并且k说:error:具有尾随返回类型的函数必须指定返回类型'auto',而不是'decltype(auto)'(演示).

哪个编译器正确?在每种情况下应该使用哪个规则(autodecltype(auto))?在尾随返回类型中使用占位符类型是否有意义?

c++ decltype trailing-return-type return-type-deduction c++14

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

确定谓词是否适用于范围的无,某些或所有元素

从C++ 11开始,在我们拥有的算法库中all_of,any_ofnone_of确定谓词是否包含范围内的所有元素,任何元素或任何元素.对这些算法之一的单个调用返回1位信息,而对于特定范围和谓词,有4种可能性:

  • 谓词包含所有元素而不包含任何元素:范围为空;
  • 谓词适用于所有元素(范围不为空);
  • 谓词不包含任何元素(并且范围不为空);
  • 谓词包含一些但不是所有元素.

有没有简明有效的方法来查找这些信息?all_of后面的调用none_of是可能的,但是(a)不能在单遍范围上工作,并且(b)准确地对谓词进行一次必要的评估.提升是可以接受的.

c++ algorithm

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

通过派生类构造函数继承访问自己的私有构造函数

考虑

struct B {
    void f();
private:
    B(int, int = 0);
};
struct D : B { using B::B; };
void B::f() {
    auto a = D{0};
    auto b = D(0);
    auto c = D(0, 0);
    D x{0};
    D y(0);
    D z(0, 0);
}
Run Code Online (Sandbox Code Playgroud)

GCC 接受(从 7.1 开始;以前拒绝所有)。Clang 接受bandxyz但拒绝aand c。MSVC 在 C++14 模式下拒绝所有,但在 C++17 模式下接受所有。

哪些编译器是正确的?C++14 和 C++17 之间的规则是否发生了变化——如果是这样,为什么在 C++14 中B::f不允许访问它自己的构造函数(命名为 via D)?为什么 Clang 只接受(函数式)强制转换 atb而不是列表初始化 at …

c++ crtp language-lawyer inheriting-constructors c++17

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

聚合初始化中 mem-initializer 的有效性和/或生命周期延长

CWG 1815询问(稍作修改):

struct A {};
struct B { A&& a = A{}; };
B b1;         // #1
B b2{A{}};    // #2
B b3{};       // #3
Run Code Online (Sandbox Code Playgroud)

[...]#2是聚合初始化,它绑定B::a到初始化器中的临时对象 for b2,从而将其生命周期延长到b2. #3是聚合初始化,但不清楚非静态数据成员初始值设定项中的临时生命周期是否B::a应该像 一样延长生命周期#2,例如#1

根据关于该问题的说明,在 Issaquah (2014-02) CWG 打算使#3行为像#2;也就是说,格式良好,并执行b3.a绑定的临时对象的生命周期扩展。但在接下来的ISO会议(拉珀斯韦尔,2014-06),分辨率为CWG 1696获得通过,表面上是解决CWG 1815,但采用的语言,似乎使#3病态的

11 - 绑定到来自默认成员初始值设定项的引用成员的临时表达式格式错误。

但是,紧接在该条款下的示例不考虑聚合初始化(如 CWG 1815),而仅考虑构造函数的初始化;具体来说,默认构造函数定义为 defaulted:

struct A {
  A() = default; …
Run Code Online (Sandbox Code Playgroud)

c++ lifetime language-lawyer temporary-objects c++14

6
推荐指数
0
解决办法
68
查看次数

临时约束需要需要需要需要吗?

假设我正在编写一个类模板,其中一些成员受到类型模板参数 static constexpr 数据成员的存在和值的限制:

\n
template<class T>\nstruct A {\n    constexpr bool operator()() requires T::value { return T::value; }\n    constexpr bool operator()() { return false; }\n};\n#include <type_traits>\nstatic_assert(A<std::true_type>()());\nstatic_assert(!A<std::false_type>()());\nstatic_assert(!A<void>()());\n
Run Code Online (Sandbox Code Playgroud)\n

MSVC 和 gcc 接受这一点,但 clang 拒绝,除非我替换 requires T::valuerequires requires { requires T::value; }. 这是 clang 中的错误,还是其他编译器松懈?C++ 是否需要需要需要需要?标准怎么说?

\n

相关(嗯,至少是\xe2\x85\x94):为什么我们需要需要需要?

\n

c++ compiler-errors language-lawyer c++-concepts c++20

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