Comments (2)
The issue you're facing is due to integer promotion in C++. When you perform operations on values of different types, C++ promotes them to a common type before performing the operation. In your case, the values you're passing to the average function include both positive and negative integers, which leads to integer promotion.
The problem is that the sizeof...(t) part of your code is evaluated as an unsigned integer (size_t), which causes all the values to be promoted to unsigned integers for the division operation. This is why you're getting an unexpected result.
To fix this issue, you can explicitly cast the result of the division to the desired type (e.g., double) to ensure that the division is performed with the correct type. Here's an updated version of your code:
#include <iostream>
template<typename ... T>
auto average(T ... t) {
return static_cast<double>((t + ...)) / sizeof...(t);
}
int main() {
std::cout << average(1, 2, 3, 4, 5, -6, -7, -8, -9, -10) << std::endl;
}
By casting the result of (t + ...), you ensure that the division is performed using a floating-point type, which can handle both positive and negative values correctly. This will give you the expected average, including negative values.
from modern-cpp-tutorial.
I have made a PR for fixing this bug. See #268
from modern-cpp-tutorial.
Related Issues (20)
- 语句有些繁琐,可否简化表达 HOT 1
- 第6章的习题设置不合理 HOT 1
- 网页端渲染存在问题 HOT 1
- 关于普通重载和override的一个区别 HOT 1
- 第二章 尾返回类型推导 “我们已经提过 auto 不能用于函数形参进行类型推导” HOT 2
- 第八章内容 HOT 1
- 网页加载速度 HOT 1
- P43 || 43页 HOT 1
- C++ 中不允许将 `NULL` 定义为 `((void*)0)` HOT 2
- `3.3` 右值引用中的错误描述 HOT 1
- lambda 表达式隐式捕获用“编译器自行推导”这种措辞极度不合适 HOT 24
- 多线程中不该牵扯 `volatile` 关键字,且描述经不起推敲没有逻辑,带有错误暗示
- `std::unique_ptr` 概念描述不够清晰 HOT 3
- RAII 不是一种语法,第七章描述错误 HOT 1
- 描述 `std::mutex` 的用词奇怪,应当更改 HOT 3
- “堆栈回退”我认为您要表达的是:“栈回溯” HOT 1
- 2.3 中的 `typeof` 不是 C++ 中的标准特性 HOT 1
- `constexpr` 一节中,是编译器扩展导致,而非是新编译器优化的问题,解释有误
- 2.6章节-显式虚虚函数重载-final禁止子类重载 的示例容易产生误解 HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from modern-cpp-tutorial.