相关疑难解决方法(0)

是否允许在std :: declval <T>上使用decltype(函数本身,而不是调用它的结果)?

以下代码在libstdc ++上触发静态断言:

#include <utility>

using t = decltype(std::declval<const void>);
Run Code Online (Sandbox Code Playgroud)

应该是?


这个问题的动机:

Eric Niebler提出的以下declval实现(显然是编译时优化)

template<typename _Tp, typename _Up = _Tp&&>
_Up __declval(int);

template<typename _Tp>
_Tp __declval(long);

template<typename _Tp>
auto declval() noexcept -> decltype(__declval<_Tp>(0));
Run Code Online (Sandbox Code Playgroud)

如果用户可以合法地观察其类型,那将是有问题的std::declval<const void>.标准中的签名

template <class T>
add_rvalue_reference_t<T> declval() noexcept;
Run Code Online (Sandbox Code Playgroud)

结果类型const void ()(或const void () noexcept在C++ 17中),而建议的版本导致类型void ()(或void () noexcept).

c++ language-lawyer c++11

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

如果方法“const”只是“浅常量”,而不是“深常量”,我应该声明它吗?

我有类Foo,它的成员bar_是指向某些数据的指针。方法modify修改数据,但不修改指针本身。因此我可以将该方法声明为const

class Foo {
public:
    Foo() : bar_(new double) {};
    void modify() const {*bar_ += 1;};
private:
    double *bar_;
};
Run Code Online (Sandbox Code Playgroud)

如果我将该方法声明为const,则可以从其他 const 方法访问它,这更加灵活。同时,我可以删除const作为其他开发人员和用户的提示,该方法间接修改数据(并认为数据归类所有)。所以我在这里有一个选择:声明modifyconst或删除const :void modify() constvoid modify().

每种方法的优缺点是什么?指导方针怎么说?我该怎么办?

c++ constants shallow-clone

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

标签 统计

c++ ×2

c++11 ×1

constants ×1

language-lawyer ×1

shallow-clone ×1