小编Jon*_*Mee的帖子

为什么C++ 11不支持指定的初始化列表作为C99?

考虑:

struct Person
{
    int height;
    int weight;
    int age;
};

int main()
{
    Person p { .age = 18 };
}
Run Code Online (Sandbox Code Playgroud)

上面的代码在C99中是合法的,但在C++ 11中不合法.

什么是标准委员会排除了这样一个方便的功能支持的理由?

c c++ initialization c99 c++11

110
推荐指数
5
解决办法
5万
查看次数

内联仍然有用吗?

我相信,inline已经过时,因为我在这里读到:

无论你如何指定一个函数inline,它都是一个允许编译器忽略的请求:编译器可能内联扩展一些,全部或没有你调用指定函数的地方inline.

然而,Angew似乎理解我不知道的事情.在这个问题中他和我来回走了很多,关于是否inline仍然有用.

这个问题不是一个问题:

请记住,编译器可以随意使用inline,因此inline在那里没有用处:可以inline用来强制而不是建议编译代码的更改?

c++ methods inline function deprecated

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

为什么我不能在另一个函数中定义一个函数?

这不是lambda函数问题,我知道我可以将lambda赋给变量.

允许我们声明,但不在代码中定义函数是什么意思?

例如:

#include <iostream>

int main()
{
    // This is illegal
    // int one(int bar) { return 13 + bar; }

    // This is legal, but why would I want this?
    int two(int bar);

    // This gets the job done but man it's complicated
    class three{
        int m_iBar;
    public:
        three(int bar):m_iBar(13 + bar){}
        operator int(){return m_iBar;}
    }; 

    std::cout << three(42) << '\n';
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

所以我想知道的是为什么C++会允许two哪些看似无用,three哪个看起来更复杂,但却不允许one

编辑:

从答案中可以看出,代码内声明可能能够防止命名空间污染,我希望听到的是为什么声明函数的能力已被允许,但是不允许定义函数的能力.

c++ functor function-declaration

78
推荐指数
5
解决办法
3万
查看次数

正在弃用的std :: iterator的准备工作

3月21 ,标准委员会投票赞成批准P0174std::iterator提议的弃用:

对于读者而言,很长的void参数序列不仅仅是简单地typedef在类定义本身中提供预期的s,这是当前工作草案采用的方法,遵循设置的模式

之前std::iterator,鼓励继承从迭代器样板实现中删除乏味.但弃用将需要以下其中一项:

  1. 迭代器样板现在需要包含所有必需的typedefs
  2. 使用迭代器的算法现在需要使用auto而不是依赖于迭代器来声明类型
  3. 洛基阿斯塔曾建议std::iterator_traits,可以更新,而继承工作std::iterator

有人可以告诉我我应该期待哪些选项,因为我设计了自定义迭代器,着眼于兼容性?

c++ standards iterator deprecated c++17

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

C++枚举从0开始?

如果我有一个enum不为枚举分配数字,它的序数值是0吗?例如:

enum enumeration { ZERO,
                   ONE,
                   TWO,
                   THREE,
                   FOUR,
                   FIVE,
                   SIX,
                   SEVEN,
                   EIGHT,
                   NINE };
Run Code Online (Sandbox Code Playgroud)

我已经能够找到一篇文章,引用C99标准需要一个0序数.但我知道C++忽略了C99标准中的几个方面.而且我也能找到一个见证编译器使用序数值为1帖子,这也是我似乎记得看到的,虽然我不知道多久以前就是这样.

我真的希望看到一个确认C++的答案,但我也想知道即使我在一个中间指定一个值,序数0是否成立enum:

enum enumeration { ZERO,
                   ONE,
                   TWO,
                   THREE = 13,
                   FOUR,
                   FIVE,
                   SIX,
                   SEVEN,
                   EIGHT,
                   NINE };
Run Code Online (Sandbox Code Playgroud)

c++ enums enumeration ordinal language-lawyer

48
推荐指数
3
解决办法
4万
查看次数

更改cin的分隔符(c ++)

我已经重定向"cin"来从文件流中读取cin.rdbug(inF.rdbug()) 当我使用提取操作符时,它会读取它直到它到达空格字符.

是否可以使用另一个分隔符?我在cplusplus.com上浏览了api,但没有找到任何东西.

c++ whitespace stream cin delimiter

42
推荐指数
4
解决办法
3万
查看次数

C和C++标准之间的关系是什么?

我正在写这个答案,我引自http://en.cppreference.com/w/cpp/string/byte/tolower#Parameters

不能表示为unsigned char且不等于EOF,行为未定义

当我去检查添加了这个短语的编辑时,我发现了作者的评论:

根据C99 7.4/1,不能对任何ctype.h函数使用负符号字符

作者引用C++文档中的C99标准.这有效吗?我在C++标准中找不到关于此函数定义的任何内容,因此我必须假设它是有效的.

但这有两个原因让我担忧:

  1. 我怎么知道C++标准所依赖的C标准的版本?
  2. 各地都有C和C++之间存在差异的列表.如果我在参考C++看C标准,我怎么可能知道我正在看的区域是否被覆盖了?

c c++ standards dependencies language-lawyer

40
推荐指数
2
解决办法
2282
查看次数

什么是Curly-Brace附上列表如果不是intializer_list?

我在这里问了一个问题:涉及非功能代码的initializer_list返回的生命周期扩展:

const auto foo = [](const auto& a, const auto& b, const auto& c) { return {a, b, c}; };
Run Code Online (Sandbox Code Playgroud)

我相信lambda试图回归intializer_list(这很糟糕,不要这样做.)但我得到了一个评论:

它不是一个initializer_list,它是一个初始化列表.两件不同的事情.

我只是认为,无论何时你做了一个花括号列表,你都在创建一个intializer_list.如果那不是正在发生的事情,花括号中的列表是什么?

c++ initialization initializer curly-braces initializer-list

31
推荐指数
3
解决办法
1349
查看次数

为什么不能"转换(s.begin(),s.end(),s.begin(),tolower)"成功编译?

鉴于代码:

#include <iostream>
#include <cctype>
#include <string>
#include <algorithm>
using namespace std;

int main()
{
     string s("ABCDEFGHIJKL");
     transform(s.begin(),s.end(),s.begin(),tolower);
     cout<<s<<endl;
}
Run Code Online (Sandbox Code Playgroud)

我收到错误:

呼叫没有匹配功能 transform(__gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, <unresolved overloaded function type>)

什么是"未解决重载函数类型"是什么意思?

如果我用tolower我写的函数替换它,它不再是错误.

c++ compiler-errors lowercase toupper tolower

28
推荐指数
4
解决办法
2万
查看次数

元编程:函数定义失败定义了一个单独的函数

这个答案中,我根据类型的is_arithmetic属性定义了一个模板:

template<typename T> enable_if_t<is_arithmetic<T>::value, string> stringify(T t){
    return to_string(t);
}
template<typename T> enable_if_t<!is_arithmetic<T>::value, string> stringify(T t){
    return static_cast<ostringstream&>(ostringstream() << t).str();
}
Run Code Online (Sandbox Code Playgroud)

dyp建议,不是is_arithmetic类型的属性,是否to_string为类型定义是模板选择标准.这显然是可取的,但我不知道如何说:

如果std::to_string未定义,则使用ostringstream重载.

声明to_string标准很简单:

template<typename T> decltype(to_string(T{})) stringify(T t){
    return to_string(t);
}
Run Code Online (Sandbox Code Playgroud)

这与我无法弄清楚如何构建的标准相反.这显然不起作用,但希望它传达了我正在尝试构建的内容:

template<typename T> enable_if_t<!decltype(to_string(T{})::value, string> (T t){
    return static_cast<ostringstream&>(ostringstream() << t).str();
}
Run Code Online (Sandbox Code Playgroud)

c++ templates result-of sfinae template-meta-programming

26
推荐指数
4
解决办法
2030
查看次数