它位于我的Eclipse Problems视图中.代码编译正常,但有一个错误说" required from here",指向一些提升头文件和行state_data const current_state=interlocked_compare_exchange(&state,new_state,old_state);
我不喜欢有错误或警告.有人知道那是什么吗?
我在下一个代码中遇到了析构函数的一些问题:
#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? …
在任意类型上执行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(...,无效())'呢?).
也就是说,这两个成语是等价的,还是在某种情况下,一个人应该优先于另一个(可能是非标准的编译器)?如果没有,是否有任何理由(例如可理解性)偏好一个而不是另一个?
我想写一个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)
如何在模板参数包上抑制未使用的参数警告?
这个程序合法吗?
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)
这是标准的实际意图吗?如果没有,它应该如何阅读或阅读?
克++出现接受的任何组合auto和decltype(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)'(演示).
哪个编译器正确?在每种情况下应该使用哪个规则(auto或decltype(auto))?在尾随返回类型中使用占位符类型是否有意义?
c++ decltype trailing-return-type return-type-deduction c++14
从C++ 11开始,在我们拥有的算法库中all_of,any_of并none_of确定谓词是否包含范围内的所有元素,任何元素或任何元素.对这些算法之一的单个调用返回1位信息,而对于特定范围和谓词,有4种可能性:
有没有简明有效的方法来查找这些信息?all_of后面的调用none_of是可能的,但是(a)不能在单遍范围上工作,并且(b)准确地对谓词进行一次必要的评估.提升是可以接受的.
考虑:
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 …
CWG 1815询问(稍作修改):
Run Code Online (Sandbox Code Playgroud)struct A {}; struct B { A&& a = A{}; }; B b1; // #1 B b2{A{}}; // #2 B b3{}; // #3[...]
#2是聚合初始化,它绑定B::a到初始化器中的临时对象 forb2,从而将其生命周期延长到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:
Run Code Online (Sandbox Code Playgroud)struct A { A() = default; …
假设我正在编写一个类模板,其中一些成员受到类型模板参数 static constexpr 数据成员的存在和值的限制:
\ntemplate<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>()());\nRun Code Online (Sandbox Code Playgroud)\nMSVC 和 gcc 接受这一点,但 clang 拒绝,除非我替换 requires T::value为requires requires { requires T::value; }. 这是 clang 中的错误,还是其他编译器松懈?C++ 是否需要需要需要需要?标准怎么说?
相关(嗯,至少是\xe2\x85\x94):为什么我们需要需要需要?
\n