小编xml*_*lmx的帖子

11
推荐指数
2
解决办法
6956
查看次数

一个未命名的函数参数可以有一个默认值吗?

以下代码在C++中是否合法?

void f(void* = 0)
{}

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

C++标准的哪一页说明这种用法是合法的?

c++ function default-parameters function-signature c++11

11
推荐指数
2
解决办法
2000
查看次数

如何在Visual Studio中将键重新绑定到"继续"命令而不是F5?

在Visual Studio中,F5用于StartDebuggingContinue,这很烦人.因为许多其他IDE /调试器不以相同的方式起作用,例如cgdb,IntelliJ IDEA.

为了简单和通用,我想对所有IDE /调试器使用一种密钥绑定方案.我不能改变其他的IDE /调试器结合两者的StartDebugging继续F5.

所以,我的问题是:

有没有办法在Visual Studio中单独绑定StartDebuggingContinue到不同的键?

ide debugging intellij-idea key-bindings visual-studio

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

C++是否允许将任何整数文字隐式转换为short int?

int main()
{
    short n1 = 8ll; // no warning

    // warning C4305: 'initializing': truncation from '__int64' to 'short'
    // warning C4309: 'initializing': truncation of constant value
    short n2 = 88888ll;
}
Run Code Online (Sandbox Code Playgroud)

我的编译器是Visual Studio 2017.

根据cppref:

整数文字的类型是值可以适合的第一种类型,从类型列表中取决于使用哪个数字基数和哪个整数后缀.

带后缀的整数文字ll应为long long int; 所以short n1 = 8ll应该触发像short n2 = 88888ll这样的警告.

如果C++ short int足够小,C++是否允许将任何整数文字隐式转换为a ?

c++ integer type-conversion literals integer-promotion

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

为什么范围的算法与std的迭代器不兼容?

#include <vector>
#include <iostream>
#include <range/v3/all.hpp>

int main()
{
    auto coll = std::vector{ 1, 2, 3 };

    ranges::copy(
        coll,
        ranges::ostream_iterator<int>{  std::cout, ", " }
    ); // ok

    ranges::copy(
        coll, 
        std::ostream_iterator<int>{ std::cout, ", " }
    ); // error 
}
Run Code Online (Sandbox Code Playgroud)

问题显示在上面的代码中.我使用range-v3-0.3.7.

对我来说,通用算法copy不应该关心目标迭代器类型,只要它满足输出迭代器的要求即可.

如果是这样,为什么范围的算法不与std的迭代器兼容?

c++ iterator c++-concepts range-v3 c++20

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

为什么ostream_iterator需要显式声明要输出的对象类型?

在当前的C++中,类ostream_iterator的设计如下:

// excerpted from the standard C++

template<class T, ...>
class ostream_iterator
{
public:
    ostream_iterator(ostream_type&);
    ...

    ostream_iterator<T,...>& operator =(const T&);
    ...
};
Run Code Online (Sandbox Code Playgroud)

对我来说,这种设计并不是最理想的.因为用户在声明ostream_iterator时必须指定类型T:ostream_iterator<int> oi(cout);事实上,cout可以将任何类型的对象作为其参数,而不是仅使用一种类型.这是一个明显的限制.

// Below is my own version

// doesn't need any template parameter here
class ostream_iterator
{
public:
    ostream_iterator(ostream_type&);
    ...

    // define a template member function which can take any type of argument and output it
    template<class T> 
    ostream_iterator<T,...>& operator =(const T&);
    ...
};
Run Code Online (Sandbox Code Playgroud)

现在,我们可以使用它如下:

ostream_iterator oi(cout);
Run Code Online (Sandbox Code Playgroud)

我认为它比它更通用,更优雅

ostream_iterator<int> oi(cout);
Run Code Online (Sandbox Code Playgroud)

我对吗?

c++ stream

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

如何检查模板参数是否是迭代器类型?

template<class T>
struct is_iterator
{
    static const bool value = ??? // What to write ???
};

int main()
{
    assert(false == is_iterator<int>::value);
    assert(true == is_iterator<vector<int>::iterator>::value);
    assert(true == is_iterator<list<int>::iterator>::value);
    assert(true == is_iterator<string::iterator>::value);
    assert(true == is_iterator<char*>::value); // a raw pointer is also an iterator
}
Run Code Online (Sandbox Code Playgroud)

问题是:如何使五个断言语句通过?

c++ templates sfinae

10
推荐指数
2
解决办法
3507
查看次数

为什么ostream_iterator不能按预期工作?

不用说以下代码:

#include <utility>
#include <vector>
#include <iostream>
#include <iterator>

using namespace std;

typedef pair<char, char> PAIR;

ostream& operator <<(ostream& os, const PAIR& r)
{
    return os << r.first;
}

int main() 
{
    vector<PAIR> coll; 

    cout << coll[0]; // OK. 

    // The following line will cause a compilation error! Why???
    copy(coll.begin(), coll.end(), ostream_iterator<PAIR>(cout)); 
}
Run Code Online (Sandbox Code Playgroud)

c++ stream

10
推荐指数
2
解决办法
1937
查看次数

为什么逗号表达式在用作放置参数时不能按预期工作?

#include <new>

using namespace std;

void f(void*)
{}

struct A
{};

int main()
{
    A a;

    f((a.~A(), &a)); // OK
    new (&a) A();    // OK

    new ((a.~A(), &a)) A(); // error C2059: syntax error : 'type'
}
Run Code Online (Sandbox Code Playgroud)

我认为(a.~A(),&a)是一个有效的表达式,可以计算为指针值,因此它应该被接受为放置参数,为什么结果不是这样?

我的编译器是VC++ 2013 RC.这是编译器错误吗?

更新:

我已经向connect.microsoft.com提交了一个错误

c++ standards expression compiler-errors visual-c++

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

为什么Java泛型不允许对泛型类型进行类型转换?

public class Main {

    public static <T> void foo(T[] bar) {
        double d = (double) bar[0]; // Error : incompatible types
    }

    public static void main(String[] args) {
        int[] int_buf = new int[8];
        foo(int_buf);
    }
}
Run Code Online (Sandbox Code Playgroud)

问题在代码中指出.

为什么Java泛型不允许对泛型类型进行类型转换?

java generics type-conversion

10
推荐指数
2
解决办法
626
查看次数