小编tem*_*boy的帖子

最令人烦恼的解析的目的是什么?

维基百科上,我发现了这个:

A a( A() );
Run Code Online (Sandbox Code Playgroud)

[这]可以消除歧义

  1. class [ A] 的变量定义,取一个类[ A]或的匿名实例

  2. 函数的函数声明,它返回一个类型为[ A] 的对象,并获取一个(未命名的)参数,该参数是一个返回类型[ A](并且不进行输入)的函数.

大多数程序员都期望第一个,但C++标准要求它被解释为第二个.

但为什么?如果大多数C++社区都期望以前的行为,为什么不把它作为标准呢?此外,如果考虑解析歧义,则上述语法是一致的.

有人可以赐教吗?为什么标准要求这个?

c++

16
推荐指数
4
解决办法
877
查看次数

"使用std :: swap"如何启用ADL?

什么是复制和交换习语这个例子显示:

friend void swap(dumb_array& first, dumb_array& second) // nothrow
{
    // enable ADL (not necessary in our case, but good practice)
    using std::swap; 

    // by swapping the members of two classes,
    // the two classes are effectively swapped
    swap(first.mSize, second.mSize); 
    swap(first.mArray, second.mArray);
}
Run Code Online (Sandbox Code Playgroud)

如何using std::swap启用ADL?ADL只需要一个不合格的名称.我看到的唯一好处using std::swap是,因为std::swap是一个函数模板,你可以在call(swap<int, int>(..))中使用模板参数列表.

如果不是这样的话,那是using std::swap为了什么?

c++ argument-dependent-lookup c++11

14
推荐指数
2
解决办法
3076
查看次数

为什么在std :: cout上显式调用operator <<会导致意外输出?

我只是好奇如果我明确地打电话会发生什么operator<<,std::cout因为我知道它a.operator()与...完全相同a().所以我这样做,它打印出一些奇怪的东西:

#include <iostream>

using std::cout;

int main()
{
    cout.operator<<("Hello World");
}
Run Code Online (Sandbox Code Playgroud)

Output: 0x80486a0

奇怪的是,它输出一个地址(地址可能不同,但它应该仍然是一个地址).我认为这是字符串的地址所以我尝试解除引用它以使其输出字符串:

*( cout.operator<<("Hello World") );
Run Code Online (Sandbox Code Playgroud)

但是我得到了很长的错误

no match for operator* in '*std::cout.std::basic_ostream<...

我觉得这很奇怪.没有任何std::cout定义会让我相信这会导致任何不同的行为; 另外,明确调用运算符函数没有区别(或至少应该).

那么为什么我得到这个输出?为什么在显式调用运算符时我收到的是地址而不是字符串本身?这甚至是内存中的地址还是垃圾输出?任何回复都表示赞赏.

c++ string iostream operator-overloading

12
推荐指数
2
解决办法
1796
查看次数

std :: forward如何获得正确的参数?

考虑:

void g(int&);
void g(int&&);

template<class T>
void f(T&& x)
{
    g(std::forward<T>(x));
}

int main()
{
    f(10);
}
Run Code Online (Sandbox Code Playgroud)

由于id-expression x是一个左值,并且std::forward对于左值和右值有重载,为什么调用不能绑定到std::forward需要左值的重载?

template<class T>
constexpr T&& forward(std::remove_reference_t<T>& t) noexcept;
Run Code Online (Sandbox Code Playgroud)

c++ templates rvalue-reference perfect-forwarding c++11

12
推荐指数
2
解决办法
1052
查看次数

为什么我不能在模板中返回数组的第一个元素?

考虑:

#include <iostream>

template <typename T> T getArray( T &arr ) {
    return *arr;
}

int main() {

    int a[] = {5, 3, 6};

    std::cout << getArray(a);

}
Run Code Online (Sandbox Code Playgroud)

它假设打印数组中的第一个元素但它不起作用.这是为什么?

它给了我错误:

error: no matching function for call to 'getArray(int [3])'
Run Code Online (Sandbox Code Playgroud)

c++ arrays templates

11
推荐指数
1
解决办法
539
查看次数

对lambda返回类型的C++ 11限制

我在这里阅读关于如何推导出C++ 11 lambda的返回类型的cppreference:

如果正文由单个return语句组成,则返回类型是返回表达式的类型(在rvalue-to-lvalue,array-to-pointer或function-to-pointer隐式转换之后)

所以我认为这意味着lambda只能有一个return语句.但为什么它仍适用于多个return语句?

编译两个编译器:

auto f = [] (bool c1, bool c2) {
    if (c1) return 1;
    if (c2) return 2;
    else    return 3;
};
Run Code Online (Sandbox Code Playgroud)

c++ lambda return language-lawyer c++11

10
推荐指数
1
解决办法
1194
查看次数

使用花括号将初始值临时值初始化为静态数据成员会导致错误

这个非常简单的代码在GCC 6.0中出错:

template<class T>
struct S {
    // error: cannot convert 'T' to 'const int' in initialization
    static const int b = T{};
};

int main() {
}
Run Code Online (Sandbox Code Playgroud)

奇怪的是,如果我使用常规大括号(T()),那么代码就会编译.这是一个错误吗?代码在clang中编译得很好.

c++ gcc c++11

10
推荐指数
1
解决办法
213
查看次数

带有两个参数包的不明确的函数调用

以下是在clang中编译但不在gcc中编译:

template <class... Ts, class... Args>
void f(Ts&&..., Args&&...);

int main()
{
    f();
}
Run Code Online (Sandbox Code Playgroud)

这是我在GCC中遇到的错误:

main.cpp: In function 'int main()':
main.cpp:30:7: error: no matching function for call to 'f()'
     f();
       ^
main.cpp:30:7: note: candidate is:
main.cpp:23:6: note: template<class ... Ts, class ... Args> void f(Ts&& ..., Args&& ...)
 void f(Ts&&..., Args&&...)
      ^
main.cpp:23:6: note:   template argument deduction/substitution failed:
main.cpp:30:7: note:   candidate expects 1 argument, 0 provided
     f();
       ^
Run Code Online (Sandbox Code Playgroud)

如果我像那样给出一个论点,f(0)它会与GCC编译但不会与Clang编译.

clang错误:

main.cpp:30:5: error: no matching function for call to …
Run Code Online (Sandbox Code Playgroud)

c++ templates c++11

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

如何为与其内联创建的对象提供模板参数?

我知道在C++中我们可以这样做:

class A {} a;
Run Code Online (Sandbox Code Playgroud)

这使得一个A名为的对象a.它相当于:

A a;
Run Code Online (Sandbox Code Playgroud)

我想知道如何用模板做这件事.例如:

template <typename T> struct N {} <int> n;
Run Code Online (Sandbox Code Playgroud)

这不会编译,但你明白了.如何为与其类定义内联创建的对象指定模板参数?这甚至可能吗?

c++ templates template-meta-programming c++11

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

如何从向量中删除第一次出现的值?

我试图从向量中获取单个元素并将其推送到向量的后面然后将其删除,这样我就不会在内存中有空的部分.擦除删除习惯用法可以执行此操作,但它会删除特定值的所有实例.我只想删除第一个.

我对标准库算法没有太多经验,我找不到合适的方法(如果有的话)来做到这一点.这是一个例子:

int main() {
    std::vector<int> v{1, 2, 3, 3, 4};

    remove_first(v, 3);

    std::cout << v; // 1, 2, 3, 4
}
Run Code Online (Sandbox Code Playgroud)

那么我该如何从这个向量中删除第一次出现的3?

c++ c++11

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