小编Gre*_*ree的帖子

可以在便携式C中写入从double到int的转换

我需要编写函数double_to_int(double val, int *err),在可能的情况下,它会将double val转换为整数; 否则报告错误(NAN/INFs/OUT_OF_RANGE).

所以伪代码实现看起来像:

if isnan(val):
    err = ERR_NAN
    return 0
if val < MAX_INT:
    err = ERR_MINUS_INF
    return MIN_INT
if ...
return (int)val
Run Code Online (Sandbox Code Playgroud)

在SO上至少有两个类似的问题:在这个答案中它以足够干净的方式解决了,虽然它是C++解决方案 - 在C中我们没有signed int的可移植数字.在这个答案中,它解释了为什么我们不能只检查(val > INT_MAX || val < INT_MIN).

因此,我看到的唯一可能的清洁方式是使用浮点环境,但它被称为实现定义的功能.

所以我的问题是:有没有办法以double_to_int跨平台的方式实现功能(仅基于C标准,甚至不考虑支持IEEE-754的目标平台).

c floating-point standards

19
推荐指数
1
解决办法
677
查看次数

c ++是否需要在用户定义的和特定于类的删除操作符中处理nullptr.

用户定义和类特定的删除操作符是否需要忽略nullptr,因为标准库中的操作符会这样做?


谷歌小组的平行讨论.

c++ nullptr language-lawyer delete-operator

16
推荐指数
2
解决办法
369
查看次数

隐藏成员模板的模板参数

来自temp.local:

在出现在类模板定义之外的类模板成员的定义中,类模板成员的名称隐藏任何封闭类模板的模板参数的名称(但不是模板参数的名称)成员,如果成员是类或函数模板).[例如:

template<class T> struct A {
  struct B { /* ... */ };
  typedef void C;
  void f();
  template<class U> void g(U);
};

template<class B> void A<B>::f() {
  B b;              // A's B, not the template parameter
}

template<class B> template<class C> void A<B>::g(C) {
  B b;              // A's B, not the template parameter
  C c;              // the template parameter C, not A's C
}
Run Code Online (Sandbox Code Playgroud)

- 结束例子]

问题是,我尝试过的每个编译器(g ++,vc,icc,clang)都将C A<B>::g(C)作为A的成员名称处理,并且不编译该示例.

这是一个常见的错误吗?

c++ standards templates name-lookup

12
推荐指数
1
解决办法
310
查看次数

(&const_object)可以被评估为临时的地址

我与一个程序员进行了讨论,其主要观点是foo可以传递以下断言,具体取决于编译器.

#include <cassert> 

const int i = 0 ; 

void foo ( const int& i ) 
{  
    assert( &::i == &i ) ; 
} 

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

他告诉我,可以评估(&i)表达式以解决某些临时对象的问题.既然我有疑惑,我就在这里.对函数的引用如何传递给函数,如果在函数中我可以检查并做任何我想要的事情和参数的地址和预期的语义必须保留.例如

#include <initializer_list>

const int i = 0 ;

bool func ( const int & i ) 
{ 
    return &::i == & i ; 
}

int main ()
{
    const int i = 0 ;
    for ( const int * each : { &::i …
Run Code Online (Sandbox Code Playgroud)

c++ const language-lawyer

5
推荐指数
1
解决办法
117
查看次数

`use path :: {self}`是什么意思?

我最近阅读了以下代码行:

use fmt::{self, Debug}; 
Run Code Online (Sandbox Code Playgroud)

self上述声明中的关键字是什么意思?

self rust

5
推荐指数
2
解决办法
201
查看次数

c ++通过“使用”在另一个而不是封闭的命名空间中定义类

g++、icc 和 clang 接受以下代码:

namespace ns { struct A ; }
namespace ns1 // note : not enclosing namespace
{ 
    using namespace ns ;
    struct A { } ;
}  
Run Code Online (Sandbox Code Playgroud)

由于标准,这是一个有效的代码。?


[命名空间。qual ]#7: ... 然而,在这样的命名空间成员声明中,嵌套名称说明符可能依赖 using-directives 隐式提供嵌套名称说明符的初始部分

如相关答案所述

您可以省略nested-name-specifier 的初始部分,但不能省略任何中间部分。

(从我知道它可以/必须在封闭的命名空间中完成,我不记得了。)

c++ namespaces class definition

3
推荐指数
1
解决办法
1172
查看次数

功能范围内的“外部字符串文字声明”

来自[dcl.link]#2

外部字符串文字声明

该段未在函数范围内指定用于声明的任何特殊情况,但以下内容也未编译:

void foo () { extern "C" int boo () ; }
Run Code Online (Sandbox Code Playgroud)

从g ++输出:

错误:字符串常量之前的预期unqualified-id

那是g ++的bug还是我错过了什么?

c++ extern linkage language-lawyer

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

在迭代时推送到向量时,Rust 是否可以保护我免受迭代器失效的影响?

Rust 是否可以保护我免受迭代器失效的影响,还是我很幸运realloc?为返回的迭代器提供了哪些保证&'a Vec<T>

fn main() {
    let mut v = vec![0; 2];

    println!("capacity: {}", v.capacity());

    {
        let v_ref = &mut v;
        for _each in v_ref.clone() {
            for _ in 0..101 {
                (*v_ref).push(1); // ?
            }
        }
    }

    println!("capacity: {}", v.capacity());
}
Run Code Online (Sandbox Code Playgroud)

iterator vector invalidation rust

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